Json - 添加到 Hive 中的 Flatten Key 和 Values 的附加列值

Json - Additional column value added to Flatten Key and Values in Hive

在具有 2 列和 2 条记录的 table 中:

记录 1:第 1 列 - my_col 值为:{"XXX": ["123","456"],"YYY": ["246","135"]},第 2 列 - ID 为 A123

记录 2:第 1 列 - my_col 值为:{"XXX": ["123","456"],"YYY": ["246","135"], "ZZZ":["333","444"]},第 2 列 - ID 为 B222

注意:Column2 不是静态的,每条记录都有不同的值。

期望:

Key Value ID
XXX 123 A123
XXX 456 A123
YYY 246 A123
YYY 135 A123
ZZZ 333 B222
ZZZ 444 B222

使用的查询:

SELECT
    t.key,
    kv.kval as value,
    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

按照你的建议扁平化就好了。面临问题从 table.

检索 ID 值

如果您的 table 包含一些其他列并且您需要 select 它们以及来自 explode 的值,则在子查询中使用另一个横向视图。看代码中的注释:

SELECT
    t.key,
    kv.kval as value,
    t.ID
FROM (
SELECT 
 e.key, e.value, --columns from lateral view
 t.id  --column from table  
FROM
    input_df t --add alias
    --move explode to lateral view in the FROM
    lateral view explode(map(
         'XXX',
         split(regexp_replace(get_json_object(my_col,'$.XXX'),'"|\[|\]',''),','),
         'YYY',
         split(regexp_replace(get_json_object(my_col,'$.YYY'),'"|\[|\]',''),',')
     )) e as key, value --add alias and col names 
) t LATERAL VIEW explode(t.value) kv as kval