Hive中JSON键值对扁平化展开时无法获取ID列问题咨询
问题根因
当前查询无法获取ID列的核心原因是内层子查询仅返回了explode生成的键值对结果,没有将原表的ID字段一并查询带出,导致外层查询无法引用ID字段。
修复方案
方案1:固定解析指定JSON键(适配原有逻辑)
如果你仅需要解析XXX、YYY两个固定键,只需在内层子查询中补充带出ID字段即可,修复后SQL如下:
SELECT t.key, kv.kval as value, t.ID FROM ( SELECT ID, -- 新增:内层查询带出原表ID字段 explode(map( 'XXX', split(regexp_replace(get_json_object(my_col,'$.XXX'),'"|\\[|\\]',''),','), 'YYY', split(regexp_replace(get_json_object(my_col,'$.YYY'),'"|\\[|\\]',''),',') )) as (key, value) -- 给explode结果指定别名,提升可读性 FROM input_df ) t LATERAL VIEW explode(t.value) kv as kval
方案2:动态解析所有JSON键(通用场景)
如果你的JSON键名不固定(比如示例中第二条记录额外出现的ZZZ键),且你使用的Hive版本在2.3.0及以上,可以用from_json函数动态解析所有键,无需硬编码键名,SQL如下:
SELECT t.key, kv.kval as value, t.ID FROM ( SELECT ID, -- 将整个JSON字符串解析为key为字符串、value为字符串数组的Map结构,再炸开所有键值对 explode(from_json(my_col, 'map<string,array<string>>')) as (key, value) FROM input_df ) t LATERAL VIEW explode(t.value) kv as kval
该方案会自动识别JSON第一层的所有键,自动适配不同记录的JSON结构差异。
内容的提问来源于stack exchange,提问作者Shan
相关产品推荐
相关产品推荐

