下面是这个问题:如何在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表达式,但可能(主观的!)更容易查看。