Hive数组嵌套JSON如何取需要的数据

数据大致格式如下,需求:
求当前公司等于P的角色(JSON中的R字段)

company_name case_role
江苏XXXX集团有限公司 [{"P":"张三","R":"申请执行人","ShowName":"张三","N":"","O":-2},{"P":"江苏XXXX集团有限公司","R":"被执行人","ShowName":"江苏XXXX集团有限公司","N":"00300fef44ee8d7cee7aa43ba0def3c8","O":0}]

case_role格式化后

[{
    "P": "张三",
    "R": "申请执行人",
    "ShowName": "张三",
    "N": "",
    "O": -2
}, {
    "P": "江苏XXXX集团有限公司",
    "R": "被执行人",
    "ShowName": "江苏XXXX集团有限公司",
    "N": "00300fef44ee8d7cee7aa43ba0def3c8",
    "O": 0
}]

要实现需求必须JSON与JSON之间能够切割,但是目前JSON间是逗号不能直接Split(case_role,','),将case_role转成

{
    "P": "张三",
    "R": "申请执行人",
    "ShowName": "张三",
    "N": "",
    "O": -2
}; {
    "P": "江苏XXXX集团有限公司",
    "R": "被执行人",
    "ShowName": "江苏XXXX集团有限公司",
    "N": "00300fef44ee8d7cee7aa43ba0def3c8",
    "O": 0
}

这样进行Split(case_role,';')后使用get_json_object取对应字段即可

第一步转换:

explode(split(regexp_replace(regexp_replace(case_role, '\\[|\\]',''),'\\}\\,\\{','\\}\\;\\{'),'\\;'))  as case_role 
regexp_replace(case_role, '\\[|\\]','')去掉[]
regexp_replace(regexp_replace(case_role, '\\[|\\]',''),'\\}\\,\\{','\\}\\;\\{')
将JSON间的逗号替换成;

第二步取值

get_json_object(a.case_role,'$.R') as case_role

最终SQL

select
    a.company_name
    ,get_json_object(a.case_role,'$.R') as case_role
from
(
    SELECT 
        ,company_name
        ,explode(split(regexp_replace(regexp_replace(case_role, '\\[|\\]',''),'\\}\\,\\{','\\}\\;\\{'),'\\;'))  as case_role 
    FROM qcc
) a
WHERE get_json_object(a.case_role,'$.P')=a.company_name

当然也可以使用正则,能解决问题就好

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容