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

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

你可能感兴趣的:(Hive数组嵌套JSON如何取需要的数据)