Presto unnest json映射

Posted

技术标签:

【中文标题】Presto unnest json映射【英文标题】:Presto unnest json map 【发布时间】:2021-07-10 21:41:55 【问题描述】:

关注这些帖子:How to cross join unnest a JSON array in Presto 和 Presto unnest json 我无法将我的 JSON 映射到所需的表中。

当我运行这个 presto 时:

SELECT
    *
FROM UNNEST(
        CAST(
            JSON_EXTRACT('"1":"a":10,"b":11,"2":"a":20,"b":21', '$.1') AS ARRAY(
                VARCHAR
                -- ROW(VARCHAR, BIGINT)
                -- MAP(VARCHAR, MAP(VARCHAR, BIGINT))
            )
        )
    ) AS x(n)

我明白了:

(INVALID_CAST_ARGUMENT) Cannot cast to array(varchar). Expected a json array, but got 
"a":10,"b":11 ... 

但我理想的预期答案是:

  a | b
 ---+---
 10 | 11
 20 | 21

我如何UNNEST Map 而不是数组?

【问题讨论】:

【参考方案1】:

您目标的正确 json 路径是 $.*,但通配符 are not supported by presto,因此您可以将 json 转换为地图并使用它:

SELECT maps['a'] a, maps['b'] b
FROM (UNNEST(map_values(
        CAST(JSON '"1":"a":10,"b":11,"2":"a":20,"b":21' AS MAP(VARCHAR , MAP(VARCHAR, INTEGER)))))) as tmp(maps);

【讨论】:

非常感谢。我不知道MAP_VALUES 关键字。 @vishwarajanand 很乐意提供帮助!有很多好用的功能,查看docs。

以上是关于Presto unnest json映射的主要内容,如果未能解决你的问题,请参考以下文章

Hive中Presto UNNEST函数的等价物是啥

检查 Presto 值映射中是不是存在键

如何在 presto 中将 varchar 转换为 MAP(VARCHAR,VARCHAR)

Presto Sql:如何选择数组中排名最高的值

UNPIVOT 一个 presto 表

手动映射 JSON 对象时,RestKit 关系未映射