gpt4 book ai didi

json - 如何使用 Hive (get_json_object) 查询结构数组?

转载 作者:可可西里 更新时间:2023-11-01 14:43:10 26 4
gpt4 key购买 nike

我将以下 JSON 对象存储在 Hive 表中:

{
"main_id": "qwert",
"features": [
{
"scope": "scope1",
"name": "foo",
"value": "ab12345",
"age": 50,
"somelist": ["abcde","fghij"]
},
{
"scope": "scope2",
"name": "bar",
"value": "cd67890"
},
{
"scope": "scope3",
"name": "baz",
"value": [
"A",
"B",
"C"
]
}
]
}

“features”是一个长度可变的数组,即所有对象都是可选的。对象具有任意元素,但它们都包含“范围”、“名称”和“值”。

这是我创建的 Hive 表:

CREATE TABLE tbl(
main_id STRING,features array<struct<scope:STRING,name:STRING,value:array<STRING>,age:INT,somelist:array<STRING>>>
)

我需要一个返回 main_id 和名为“baz”的结构值的 Hive 查询,即,

main_id baz_value
qwert ["A","B","C"]

我的问题是 Hive UDF“get_json_object”仅支持有限版本的 JSONPath。它不支持像 get_json_object(features, '$.features[?(@.name='baz')]') 这样的路径。

如何用Hive查询想要的结果?使用另一个 Hive 表结构可能更容易吗?

最佳答案

我找到了一个解决方案:

使用 Hive explode UDTF展开结构数组,即创建第二个(临时)表,其中为数组“特征”中的每个结构创建一个记录。

CREATE TABLE tbl_exploded as
select main_id,
f.name as f_name,
f.value as f_value
from tbl
LATERAL VIEW explode(features) exploded_table as f
-- optionally filter here instead of in 2nd query:
-- where f.name = 'baz';

结果是:

qwert, foo, ab12345
qwert, bar, cd67890
qwert, baz, ["A","B","C"]

现在您可以像这样选择 main_id 和值:

select main_id, f_value from tbl_exploded where f_name = 'baz';

关于json - 如何使用 Hive (get_json_object) 查询结构数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28716165/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com