如何在Hive中从多JSON拼接字符串提取各id并关联父ID?
Hive SQL解析分隔JSON字符串提取ID问题解决
问题场景
数据库表结构及数据如下:
| Parent ID | Profile JSON |
|---|---|
| 1 | {"profileState":"ACTIVE","isDefault":"true","joinedOn":"2019-03-24T15:19:52.639Z","profileType":"ADULT","id":"abc","signupDeviceId":"1"}||{"profileState":"ACTIVE","isDefault":"true","joinedOn":"2021-09-05T07:47:00.245Z","imageId":"19","profileType":"KIDS","name":"Kids","id":"efg","signupDeviceId":"1"} |
其中Profile JSON字段存储了用||分隔的多个JSON字符串,需要拆分后提取每个JSON中的id值,最终期望输出:
| Parent ID | ID |
|---|---|
| 1 | abc |
| 1 | efg |
此前尝试的两种方法要么返回id为NULL,要么仅提取第一个id值,以下是可行解决方案。
正确实现语句
SELECT parent_id, get_json_object(profile_json_item, '$.id') AS id FROM your_table_name LATERAL VIEW EXPLODE(split(profile_json, '\\|\\|')) exploded AS profile_json_item;
关键步骤说明
- 拆分JSON数组:
split(profile_json, '\\|\\|')将Profile JSON字段按||拆分为JSON字符串数组。由于Hive中竖线是正则表达式特殊字符,必须用双反斜杠转义。 - 展开数组为多行:
LATERAL VIEW EXPLODE(...)将数组横向展开,每个JSON字符串单独占一行,同时保留原parent_id的关联关系。 - 提取ID字段:
get_json_object(profile_json_item, '$.id')从单个JSON字符串中精准提取id字段的值。
注意事项
如果JSON字符串内部包含||这类分隔符,上述拆分逻辑会失效,此时需要考虑自定义UDF等更严谨的解析方式,但针对当前示例数据,该语句可正常输出期望结果。
内容的提问来源于stack exchange,提问作者Will
相关产品推荐
相关产品推荐

