Hive解析json数组

作者: 风筝flying | 来源:发表于2019-11-28 14:26 被阅读0次

    在使用Hive搭建数据仓库,处理数据时,同传统数仓的结构化数据不同,我们经常会遇到一些非结构化的数据,json格式的字符串就是常见的一种类型。
    对于简单的json字符串,Hive提供了get_json_object函数用来提取字符串中的相应信息,但如果遇到如下样式的json字符串数组

    [{"disttype":"直线","placeid":'abcdef',"place":"距景点A直线xxx米 · xx山风景区外","motivateinfo":"","labels":"游玩|休闲|"},
    {"disttype":"直线","placeid":'hijklmn',"place":"距景点A直线xxy米 · xx山风景区外","motivateinfo":"","labels":"低价|亲子|"}]
    

    此时就需要explode函数来处理这种情况;
    下面先上代码,然后再分步讲解:

    select m.d,j.info,get_json_object(j.info,'$.placeid') hotelid,
           get_json_object(j.info,'$.labels') tag
      from (select d,split(regexp_replace(regexp_extract(
                                                  '[{"disttype":"直线","placeid":'abcdef',"place":"距景点A直线xxx米 · xx山风景区外","motivateinfo":"","labels":"游玩|休闲|"},
    {"disttype":"直线","placeid":'hijklmn',"place":"距景点A直线xxy米 · xx山风景区外","motivateinfo":"","labels":"低价|亲子|"}]',
                                 '\\}\\,\\{','\\}\\|\\|\\{'),
                        '\\|\\|') info_array
              from table) m  
     lateral view explode(info_array) j as info;
    

    说明:

    • explode函数要求参数必须是array或者map类型,所以需要先把字符串转成array
    • regexp_extract('xxx','^\[(.+)\]$',1) 这里是把需要解析的json数组去除左右中括号,需要注意的是这里的中括号需要两个转义字符\[。
    • regexp_replace('xxx','\}\,\{', '\}\|\|\{') 把json数组的逗号分隔符变成两根竖线||,可以自定义分隔符只要不在json数组项出现就可以。
    • 使用split函数返回的数组,分隔符为上面定义好的。
    • lateral view explode处理3中返回的数组
    • 然后就可以使用get_json_object或者json_tuple来一条条处理json数据了

    相关文章

      网友评论

        本文标题:Hive解析json数组

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