首页 > 解决方案 > 从 Presto varchar 列解析 JSON 失败

问题描述

我正在尝试将我的varchar列数据 stringifed转换JSONMAP数据类型,以便我可以将数据作为元素引用。

WITH
data(c) AS (
    SELECT message from mydb.mytable
),
parsed AS (
    SELECT cast(json_parse(c) as map(varchar, varchar)) AS m
    FROM data
)
SELECT m['action'], m['uuid']
FROM parsed

示例数据如下所示: {"action":"send","timestamp":1566432054,"uuid":"1234"}

我尝试了此处提供的解决方案:How to cast varchar to MAP(VARCHAR,VARCHAR) in presto,这是我从替换语句中获得查询的地方,valuesselect它不起作用。我得到错误:

INVALID_CAST_ARGUMENT: Value cannot be cast to map(varchar,varchar)

标签: presto

解决方案


json_parse+cast处理您的示例数据:

SELECT CAST(json_parse(str) AS map(varchar, varchar))
FROM (VALUES '{"action":"send","timestamp":1566432054,"uuid":"1234"}') t(str);

我在 Presto 317 上对此进行了测试:

presto> SELECT CAST(json_parse(str) AS map(varchar, varchar))
     -> FROM (VALUES '{"action":"send","timestamp":1566432054,"uuid":"1234"}') t(str);
                     _col0
------------------------------------------------
 {action=send, uuid=1234, timestamp=1566432054}
(1 row)

我的猜测是某些数据行与您的示例不同,并且此数据行不能cast。您可以通过以下方式找到它try

SELECT str
FROM your_table
WHERE str IS NOT NULL
AND try(CAST(json_parse(str) AS map(varchar, varchar))) IS NULL;

推荐阅读