美文网首页
Hive数组嵌套JSON如何取需要的数据

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

作者: 喵星人ZC | 来源:发表于2022-04-13 17:27 被阅读0次

    数据大致格式如下,需求:
    求当前公司等于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如何取需要的数据

          本文链接:https://www.haomeiwen.com/subject/jxsasrtx.html