Json - 扁平化 Hive 中的键和值
Json - Flatten Key and Values in Hive
在 Hive table 中,记录 JSON 列值为:{"XXX": ["123","456"],"YYY": ["246"," 135"]} 和 ID 为 ABC
需要在 Hive 查询中将其展平,如下所示。
Key
Value
ID
XXX
123
ABC
XXX
456
ABC
YYY
246
ABC
YYY
135
ABC
以下使用 get_json_object
提取 json 键,然后使用 regexp_replace
和 split
将剩余值转换为数组。在结果子查询的 explode
和 lateral views
的帮助下,数据已被提取。完整的可重现示例如下:
WITH input_df AS (
SELECT '{"XXX": ["123","456"],"YYY": ["246","135"]}' my_col
)
SELECT
t.key,
kv.kval as value
FROM (
SELECT
explode(map(
'XXX',
split(regexp_replace(get_json_object(my_col,'$.XXX'),'"|\[|\]',''),','),
'YYY',
split(regexp_replace(get_json_object(my_col,'$.YYY'),'"|\[|\]',''),',')
))
FROM
input_df
) t LATERAL VIEW explode(t.value) kv as kval
如果您的 table/view 名为 input_df
且您的 json 列为 my_col
,则您可以使用下面的查询
SELECT
t.key,
kv.kval as value
FROM (
SELECT
explode(map(
'XXX',
split(regexp_replace(get_json_object(my_col,'$.XXX'),'"|\[|\]',''),','),
'YYY',
split(regexp_replace(get_json_object(my_col,'$.YYY'),'"|\[|\]',''),',')
))
FROM
input_df
) t LATERAL VIEW explode(t.value) kv as kval
对更新后的问题 1 的回复:
SELECT
t.key,
kv.kval as value,
'ABC' as ID
FROM (
SELECT
explode(map(
'XXX',
split(regexp_replace(get_json_object(my_col,'$.XXX'),'"|\[|\]',''),','),
'YYY',
split(regexp_replace(get_json_object(my_col,'$.YYY'),'"|\[|\]',''),',')
))
FROM
input_df
) t LATERAL VIEW explode(t.value) kv as kval
让我知道这是否适合你。
在 Hive table 中,记录 JSON 列值为:{"XXX": ["123","456"],"YYY": ["246"," 135"]} 和 ID 为 ABC
需要在 Hive 查询中将其展平,如下所示。
Key | Value | ID |
---|---|---|
XXX | 123 | ABC |
XXX | 456 | ABC |
YYY | 246 | ABC |
YYY | 135 | ABC |
以下使用 get_json_object
提取 json 键,然后使用 regexp_replace
和 split
将剩余值转换为数组。在结果子查询的 explode
和 lateral views
的帮助下,数据已被提取。完整的可重现示例如下:
WITH input_df AS (
SELECT '{"XXX": ["123","456"],"YYY": ["246","135"]}' my_col
)
SELECT
t.key,
kv.kval as value
FROM (
SELECT
explode(map(
'XXX',
split(regexp_replace(get_json_object(my_col,'$.XXX'),'"|\[|\]',''),','),
'YYY',
split(regexp_replace(get_json_object(my_col,'$.YYY'),'"|\[|\]',''),',')
))
FROM
input_df
) t LATERAL VIEW explode(t.value) kv as kval
如果您的 table/view 名为 input_df
且您的 json 列为 my_col
SELECT
t.key,
kv.kval as value
FROM (
SELECT
explode(map(
'XXX',
split(regexp_replace(get_json_object(my_col,'$.XXX'),'"|\[|\]',''),','),
'YYY',
split(regexp_replace(get_json_object(my_col,'$.YYY'),'"|\[|\]',''),',')
))
FROM
input_df
) t LATERAL VIEW explode(t.value) kv as kval
对更新后的问题 1 的回复:
SELECT
t.key,
kv.kval as value,
'ABC' as ID
FROM (
SELECT
explode(map(
'XXX',
split(regexp_replace(get_json_object(my_col,'$.XXX'),'"|\[|\]',''),','),
'YYY',
split(regexp_replace(get_json_object(my_col,'$.YYY'),'"|\[|\]',''),',')
))
FROM
input_df
) t LATERAL VIEW explode(t.value) kv as kval
让我知道这是否适合你。