hive split函数_生产Hive优雅处理嵌套JSON

e8a5474d856c8d9931433ed1d9fdb6f7.gif

c45b68410f3ee492ef0f8d1386476239.png

这句话送给各位,有时人也是这样,

比如跳槽转型,就仿佛回到最初,辛苦但却满足。

祝金九银十的奔跑的people,

都能够找份满意的work。

一、背景

最近有个需求,需要解析数仓中某张表的某个字段,该字段为JSON,且为嵌套的多层JSON,JSON数据格式化之后如下:

318cfd8148faa4605d7a73b15ffd3440.png

由于是生产环境上的数据,因此对于某些value以xxx进行替代,并不影响sql的编写样例:

[{"categoryId":"9","categoryName":"xxx","brandList":[{"brandId":"597","brandName":"xxx"}]},{"categoryId":"5","categoryName":"xxx","brandList":[{"brandId":"597","brandName":"xxx"}]},{"categoryId":"10","categoryName":"xxx","brandList":[{"brandId":"529","brandName":"xxx","seriesList":[{"seriesId":"22","seriesName":"xxx"}]}]}][{"brandList":[{"brandId":"752","brandName":"xxx"},{"brandId":"516","brandName":"xxx"},{"brandId":"650","brandName":"xxx"},{"brandId":"586","brandName":"xxx"},{"brandId":"630","brandName":"xxx"}],"categoryId":"542","categoryName":"xxx"},{"brandList":[{"brandId":"752","brandName":"xxx"},{"brandId":"650","brandName":"xxx"}],"categoryId":"7","categoryName":"xxx"},{"brandList":[{"brandId":"529","brandName":"xxx","seriesList":[{"seriesId":"22","seriesName":"xxx"}]}],"categoryId":"10","categoryName":"xxx"}]

需求是需要提取出每个这种JSON中所有的brandName。

二、解决方案

2.1 思路1:

使用hive自带的get_json_object函数进行处理

select get_json_object(brand_control,"$[0].brandList"),       get_json_object(get_json_object(brand_control,"$[0].brandList"), "$[0].brandName")from 库名.表名where dayid='20190729'

‍尝试之后,发现最终的效果只能是取出其中一个brandname,并不能取出全部。

2.2 思路2:
既然使用自带的json处理函数不能满足,那么就自己去开发一个udf函数,思路比较简单,只要将读入的每个json进行解析,一个for循环,将里面的brandName依次拿出来就行。

2.3 思路3:其实Hive SQL也可以一行sql直接搞定,没必要写什么udf,思路如下:

1)将json 以brand_name进行切分成多行 使用lateral view和explode进行配合处理

2)对每一行数据进行处理 提取出品牌名

3)剔除为数字的情况

select   seller_id,  collect_set(split(split(brand_name,'":"')[1],'"')[0]) as brand_namefrom   (select     seller_id,    brand_name,    brand_control  from 库名.表名  lateral view     explode(      split(brand_control,'brandName')      ) adTable as brand_name  where dayid = '20190729'  ) awhere (split(split(brand_name,'":"')[1],'"')[0] REGEXP '[^0-9.]')!=0  --剔除brand_name为数字的情况group by seller_id

这样,对应的一个seller_id就将对应的所有branName给全部取了出来,以一个list的形式拼接在了一起。


最新文章回顾:

金九银十的100道大数据面试题

自测 | 13家大数据面试题

高级班学员又一个总结

36岁做管理如何转型大数据

2019情人节线下项目第15期圆满结束

捷报:连续10周若泽数据第32-34名学员喜捷offer(年薪40W)

捷报:连续11周若泽数据第35-36名学员喜捷offer(年薪50W)

如何避免生产Spark Shuffle的某场景

解决生产CDH Spark2的No such file or directory错误

生产上Spark对MySQL加载并发提高的两种代码(彩蛋)

生产大数据集群资源监控--指标获取(含code)

生产大数据集群资源监控--HDFS指标获取(含code)


Spark+Flink全栈训练营

高级班第7期

dd02221a50a46792bf5b801211c6888a.png

单击【】,获取高级班课表

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值