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_replacesplit 将剩余值转换为数组。在结果子查询的 explodelateral 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

让我知道这是否适合你。