SQL:LATERAL VIEW函数解析多嵌套的json

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQL:LATERAL VIEW函数解析多嵌套的json相关的知识,希望对你有一定的参考价值。

参考技术A 数据处理中,一遇到json就头大,很长一段时间里,明知lateral view函数是个好东西,但就是很抗拒去学,都是找数仓的同事先理好字段直接用,顺便以菜鸡的身份,同情和膜拜一下埋头洗脏数的数仓同学,大佬辛苦。。

前段时间加入到一个数据建设的项目中作为先锋军打头阵,没办法遇到json还是硬着头皮终于学会了lateral view用法,感受:困难只是心中的一座大山!也不过如此!

我肯定我过不了几天一定会忘掉(其实已经忘掉一点了。。),没有好记性拿起烂笔头,记录在这里吧。

假设T表中有个json_txt字段取值格式如下:

如果我要得到每个学生的所有信息字段,则需要将json中的信息解析出来。

得到结果如下:

但是score和rank是以数列形式存储在同一行,不方便计算,用trans_array()函数可以解决啦:

得到的结果就是纵列的分数明细:

解析Hive复杂字段1--lateral view explode

参考技术A 一次比较复杂的从Hive复杂格式字段解析出多个hotelid的过程

1.    所需数据信息在value字段中,value字段是json格式,首先要提取出该字段中的htllist信息

get_json_object(value,'$.htllist')

2. get_json_object的返回值是string格式,具体信息如下

字符串前后有'['和']',每个内是单个酒店的信息,之前以','分隔

4.为了之后把每个分隔出来,需要先将','分隔符替换成'|'分隔符,并且将'[]'替换成‘’

regexp_replace(regexp_replace(get_json_object(value,'$.htllist'),',','\\|'),'\\]|\\[','')

5.将上一步得到的字符串按照'|'分隔,得到每个酒店信息的数组

lateral view explode(split(m.htllist,'\\|')) n as htlinfo

6.str_to_map函数将酒店信息数组的每个元素转换成map格式,取其中的['hotelid']信息

str_to_map(regexp_replace(n.htlinfo,'\\|\\|"',''),',',':')['hotelid']

7.完整的提取sql如下

select str_to_map(regexp_replace(n.htlinfo,'\\|\\|"',''),',',':')['hotelid'] htlinfo,m.vid,m.sid,m.pvid,m.uid,m.cid

  from (select regexp_replace(regexp_replace(get_json_object(value,'$.htllist'),',','\\|'),'\\]|\\[','') htllist,vid,sid,pvid,uid,cid

          from table_xxx

        where d='2018-08-08'

          and pagecode='condition1'

          and key ='condition2' limit 100)m

  lateral view explode(split(m.htllist,'\\|')) n as htlinfo

where m.htllist is not null

以上是关于SQL:LATERAL VIEW函数解析多嵌套的json的主要内容,如果未能解决你的问题,请参考以下文章

Hive Lateral View + explode 详解

解析Hive复杂字段1--lateral view explode

Hive行转列(explode/lateral view)

HIVE SQL lateral view 处理字段

Hive中grouping sets与lateral view explode的用法

Hive中grouping sets与lateral view explode的用法