1500字范文,内容丰富有趣,写作好帮手!
1500字范文 > android json字符串转成json对象_【hive】解析JSON格式字符串

android json字符串转成json对象_【hive】解析JSON格式字符串

时间:2020-01-16 10:46:39

相关推荐

android json字符串转成json对象_【hive】解析JSON格式字符串

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

以下是本期内容:

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里的转义字符。

点击了解更多。。。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。