莫听穿林打叶声|何妨吟啸且徐行
以下是本期内容:
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_listLATERAL 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_listLATERAL VIEW json_tuple(user_log,'source_id','properties','events') a AS source_id,properties,eventsLATERAL 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里的转义字符。
点击了解更多。。。