Presto unnest json



下面是这个问题:如何在presto 中交叉联接未测试的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

SELECT JSON_EXTRACT('{"payload":[{"type":"b","value":"9"}, {"type":"a","value":"8"}]}','$.payload')

给出:

[{"type":"b","value":"9"}, {"type":"a","value":"8"}]

即CCD_ 4。您可以将查询更改为: 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)

您可以对各个列使用JSON_EXTRACT、CAST和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

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

ARRAY<MAP<VARCHAR,VARCHAR>>

但缺点是,无法使用点表示法访问映射中的值。

假设的另一种数据类型是:

ARRAY(ROW(type VARCHAR, value VARCHAR))

类似于等效的ARRAY<STRUCT<Hive数据类型。

这里大量离题>>JSON有点模棱两可。

哪一个是正确的?JSON对象是映射的表示(hashmap、字典、键值对,无论您的语言如何称呼它),还是更像一个结构(对象、类、名称包属性,无论您语言如何称呼)?它源于JavaScript(Object Notation),旨在满足数组、对象和基元类型的需求,但更广泛的使用意味着它在其他语言中具有模糊映射(ha)。也许功能上是等效的,但理论上MAP对于随机读/写应该更快,ROW可能有一些额外的面向对象的开销,但这都是在Java中实现的,在Java中,一切都是对象,所以我没有答案。使用你喜欢的任何东西<lt;我离题了

您发现这有点冗长:

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表达式,但可能(主观的!)更容易查看。

相关内容

  • 没有找到相关文章

最新更新