从 Presto varchar 列解析 JSON 失败

Cra*_*ver 2 presto

我正在尝试将我的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
Run Code Online (Sandbox Code Playgroud)

示例数据如下所示: {"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)

Pio*_*sen 5

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

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

我在 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)
Run Code Online (Sandbox Code Playgroud)

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

SELECT str
FROM your_table
WHERE str IS NOT NULL
AND try(CAST(json_parse(str) AS map(varchar, varchar))) IS NULL;
Run Code Online (Sandbox Code Playgroud)