莫听穿林打叶声|何妨吟啸且徐行
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.eventsFROM 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)
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),'\}\,\{', '\}\|\|\{'),'\|\|'))

END
欢迎关注“数据分析且徐行”公众号
愿在数据之路上 且行且自在
实用 | 专业| 干货
我在且徐行等你~
文章转载自数据分析且徐行,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。








