presto unnest json

mzillmmw  于 2021-05-29  发布在  Hadoop
关注(0)|答案(3)|浏览(746)

接下来的问题是:如何在presto中交叉连接unnest一个json数组
我试图运行提供的示例,但这样做时出现错误
sql命令:

select x.n
from
unnest(cast(json_extract('{"payload":[{"type":"b","value":"9"}, 
{"type":"a","value":"8"}]}','$.payload') as array<varchar>)) as  x(n)

我的错误是: Value cannot be cast to array<varchar> java.lang.RuntimeException: java.lang.NullPointerException: string is null

relj7zay

relj7zay1#

您可以使用json对相应的列进行提取、强制转换和最终unnest

SELECT type,value FROM 
UNNEST(CAST(JSON_EXTRACT('{"payload":[{"type":"b","value":"9"}, 
                          {"type":"a","value":"8"}]}'
                         ,'$.payload'
                 ) as ARRAY(ROW(type VARCHAR, value VARCHAR)
            )
       )
) as x(type,value)

输出如下

type | value
------+-------
 b    | 9
 a    | 8
6za6bjd0

6za6bjd02#

返回数据类型的一种可能解释如下:

ARRAY<MAP<VARCHAR,VARCHAR>>

但是它的缺点是不能使用点符号来访问Map中的值。
假设的另一种数据类型是: ARRAY(ROW(type VARCHAR, value VARCHAR)) 就像 ARRAY<STRUCT< 配置单元数据类型等效。
这里大量的离题>>json有点模棱两可。
哪一个是正确的?json对象是Map的表示(hashmap、dictionary、key-value对,无论您的语言如何调用它)还是更像一个struct(对象、类、名称包属性,无论您的语言如何调用它)?它起源于javascript(object notation),旨在满足数组、对象和基元类型的需要,但更广泛的使用意味着它在其他语言中具有模糊Map(ha)。也许在功能上是等价的,但在理论上 MAP 对于随机读/写和 ROW 可能有一些额外的面向对象的开销,但这都是用java实现的,在java中,所有的东西都是一个对象,所以我没有答案。随便你用。<<我离题了。
你觉得这有点冗长:

SELECT 
x.n['type'] as "type",
x.n['value'] as "value"
FROM UNNEST (
            CAST(
                JSON_EXTRACT('{"payload":[{"type":"b","value":"9"},{"type":"a","value":"8"}]}'
                             ,'$.payload') 
                AS ARRAY<MAP<VARCHAR, VARCHAR>>
                )
            ) 
        AS x(n)

这是另一种选择

SELECT
    n.type,
    n.value
FROM UNNEST(
            CAST(
                JSON_EXTRACT(
                            '{"payload":[{"type":"b","value":"9"},{"type":"a","value":"8"}]}'
                            ,'$.payload'
                            ) 
                as ARRAY(ROW(type VARCHAR, value VARCHAR))
                )
            ) as x(n)

它同样冗长;列的名称只是转移到cast表达式,但可能(主观!)更容易看。

5tmbdcev

5tmbdcev3#

SELECT JSON_EXTRACT('{"payload":[{"type":"b","value":"9"}, {"type":"a","value":"8"}]}','$.payload') 给予: [{"type":"b","value":"9"}, {"type":"a","value":"8"}] 哪个是 ARRAY<MAP<VARCHAR,VARCHAR>> . 您可以将查询更改为: SELECT x.n FROM UNNEST (CAST(JSON_EXTRACT('{"payload":[{"type":"b","value":"9"},{"type":"a","value":"8"}]}','$.payload') AS ARRAY<MAP<VARCHAR, VARCHAR>>)) AS x(n)

相关问题