暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

【hive】解析JSON格式字符串

数据分析且徐行 2021-09-15
2250


莫听穿林打叶声|何妨吟啸且徐行


以下是本期内容:

hive中解析简单JSON字符串,以及解析比较复杂的嵌套JSON格式的字符串




本文大纲:
    01.get_json_object解析json中的单个属性
    02.json_tuple解析json中的多个属性
    03.解析多层嵌套Json

    正文


    • 01  解析json中的单个属性

      select get_json_object(user_log,'$.source_id') 
      from user_log_list
      • 使用$表示json变量,然后用 . 读取对象;

      • 使用get_json_object()的时候一次只能解析json对象里的一个字段。


      • 02  解析json中的多个属性

        select json_tuple(user_log,'source_id','properties','events') 
        from user_log_list

                           

        • 03  解析多层嵌套Json

        单条JSON日志user_log的格式如下:

          {
          "source_id":1000,
          "properties":{
          "user_id":"10245784",
          "device_id":"1001245"
          },
          "events":[
          {
          "event_id":2,
          "event_data":{
          "mode":6,
          "intro":"想要的都在这里,一键满足需求"
          }
          },
          {
          "event_id":4,
          "event_data":{
          "mode":6,
          "intro":"7X24小时为您服务是我们的宗旨"
          }
          }
          ]
          }

          1、LATERAL VIEW

          我们通过多次使用Lateral view 语句解析多层嵌套的json,“lateral view”表示“横向视图”,“lateral”作为动词时表示“横向传球”。

          我们看下面这张json解析逻辑图可以看出,解析完一层后,把解析出来的字段添加至原有视图的右侧(此处的逻辑类似于select * from 原有视图 left outer join 新解析出来的字段,通过这种方式把一行数据拆分成多行),继续解析下一层,以此类推。


            SELECT user_log,a.source_id,a.properties,a.events 
            FROM user_log_list
            LATERAL VIEW json_tuple(user_log,'source_id','properties','events') a AS source_id,properties,events
            --视图别名为a,生成新列的别名为source_id,properties,events

            注意:在使用lateral view的时候必须指定视图别名和生成新列的别名


            2、LATERAL VIEW explode

            events并不是map(字典)格式,而是数组,无法通过json_tuple方法进行解析,所以我们用explode方法来解析数组。

              SELECT user_log,a.source_id,b.user_id,b.device_id,d.event_id,d.event_data FROM user_log_list
              LATERAL VIEW json_tuple(user_log,'source_id','properties','events') a AS source_id,properties,events
              LATERAL VIEW explode(split(regexp_replace(regexp_extract(b.events,'^\\[(.+)\\]$',1),'\\}\\,\\{', '\\}\\|\\|\\{'),'\\|\\|')) c AS list

              解释:

                regexp_extract(b.events,'^\[(.+)\]$',1)
                其中正则表达式'^\[(.+)\]$'代表的是在b.events中匹配出以"["开头且以"]"结尾的中间的所有字符,index指定为1表示返回正则表达式中第一个() 对应的结果。
                  regexp_replace(regexp_extract(b.events,'^\[(.+)\]$',1),'\}\,\{', '\}\|\|\{')
                  将数组中分隔各元素的逗号,替换成双竖杠。
                    split(regexp_replace(regexp_extract(b.events,'^\[(.+)\]$',1),'\}\,\{', '\}\|\|\{'),'\|\|')
                    表示以双竖杠分割字符串,返回结果为一个数组。
                      LATERAL VIEW explode(split(regexp_replace(regexp_extract(b.events,'^\[(.+)\]$',1),'\}\,\{', '\}\|\|\{'),'\|\|'))
                      用explode解析该数组,结合LATERAL VIEW生成新的横向视图。
                      ⑤上述表达式中的双反斜杠\为hive里的转义字符。






                      END





                       欢迎关注“数据分析且徐行”公众号




                      愿在数据之路上   且行且自在




                        实用 | 专业| 干货

                      我在且徐行等你~




                      文章转载自数据分析且徐行,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                      评论