【问题标题】:Parse JSON from Presto varchar column fails从 Presto varchar 列解析 JSON 失败
【发布时间】:2020-01-03 04:12:29
【问题描述】:

我正在尝试将我的varchar 列数据(字符串化JSON)转换为MAP 数据类型,以便我可以将数据作为元素引用。

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,这是我通过将 values 替换为 select 语句得到查询的地方,但它不起作用。我得到错误:

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

【问题讨论】:

    标签: presto


    【解决方案1】:

    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;
    

    【讨论】:

    • 是的,你是 100% 正确的。数据并不总是可以解析为 JSON,也不是“可转换”到 Map(varchar, vachar)。我现在将更多地使用try。非常感谢您的教育;)
    • 不客气。您可能还想加入 Presto Community Slack (prestosql.io/community.html),在那里您可以获得更多帮助(如果适合 SO 的 Q&A 格式)。
    猜你喜欢
    • 1970-01-01
    • 2016-05-31
    • 2015-10-05
    • 2015-10-19
    • 2015-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多