接下来的问题是:如何在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
3条答案
按热度按时间relj7zay1#
您可以使用json对相应的列进行提取、强制转换和最终unnest
输出如下
6za6bjd02#
返回数据类型的一种可能解释如下:
但是它的缺点是不能使用点符号来访问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中,所有的东西都是一个对象,所以我没有答案。随便你用。<<我离题了。你觉得这有点冗长:
这是另一种选择
它同样冗长;列的名称只是转移到cast表达式,但可能(主观!)更容易看。
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)