一、背景
最近有个需求,需要解析数仓中某张表的某个字段,该字段为JSON,且为嵌套的多层JSON,JSON数据格式化之后如下:
![e1df18ece0230f4122980ba1c9b80ce9.png](https://img-blog.csdnimg.cn/img_convert/e1df18ece0230f4122980ba1c9b80ce9.png)
由于是生产环境上的数据,因此对于某些value以xxx进行替代,并不影响sql的编写样例:
![623fc6c127ca4946886994b02b62f241.png](https://img-blog.csdnimg.cn/img_convert/623fc6c127ca4946886994b02b62f241.png)
需求是需要提取出每个这种JSON中所有的brandName。
二、解决方案
2.1 思路1:
使用hive自带的get_json_object函数进行处理
![2a121f9c5b027a5e28fe3a1e8e5ed91d.png](https://img-blog.csdnimg.cn/img_convert/2a121f9c5b027a5e28fe3a1e8e5ed91d.png)
尝试之后,发现最终的效果只能是取出其中一个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)剔除为数字的情况
![3366504bcfdd13cfa5e1a62269909453.png](https://img-blog.csdnimg.cn/img_convert/3366504bcfdd13cfa5e1a62269909453.png)
这样,对应的一个seller_id就将对应的所有branName给全部取了出来,以一个list的形式拼接在了一起。