Hive 内部提供了大量的内置函数用于处理各种类型的需求。从内置的 UDF 可以看到两个用于解析 Json的函数:get_json_object 和 json_tuple。用过这两个函数的肯定知道,其只能解析最普通的 Json 字符串,如下:
select get_json_object('{"website":"www.cnss.cn","name":"juying"}', '$.website');
select json_tuple('{"website":"www.cnss.cn","name":"juying"}', 'website', 'name');
注意:json_tuple 相对于 get_json_object 的优势就是一次可以解析多个 Json 字段。
如果我们有个 Json 数组,这两个函数都无法处理,get_json_object 处理 Json 数组的功能很有限
select get_json_object('[{"website":"www.cnss.cn","name":"juying"},
{"website":"cloud.cnss.com","name":"juying 中文文档"}]', '$.[1].website');
注意:如果我们想将整个 Json 数组里面的 website 字段都解析出来,如果这么写将非常麻烦,因为我们无法确定数组的长度,而且即使确定了,这么写可维护性也很差,所以我们需要想别的办法。
explode() 接收一个 array 或 map 类型的数据作为输入,然后将 array 或 map 里面的元素按照每行的形式输出。其可以配合 LATERAL VIEW 一起使用。
语句举例一:
select json_tuple(json, 'website', 'name')
from
(SELECT explode(split(regexp_replace(regexp_replace('[{"website":"www.cnss.cn","name":"juying"},{"website":"cloud.cnss.com","name":"carbondata 中文文档"}]', '},{','};{'),'[|]',''),';')) as json) cnss;
语句举例二:
select explode(split(regexp_replace(regexp_replace('[{"website":"www.cnss.cn","name":"juying"},
{"website":"cloud.cnss.com","name":"carbondata 中文文档"}]', '},{','};{'),'[|]',''),';')) as json
解释:
regexp_replace('json数组', '},{','};{') ====》把json数组中的分隔符替换成为;分号
regexp_replace('qweqw','[|]','') ====》 |表示or 把json中的[或者]替换成为空
explode 函数只能接收数组或 map 类型的数据,而 split 函数生成的结果就是数组;
语句举例一 regexp_replace 的作用是将 Json 数组元素之间的逗号换成分号,,
regexp_replace('[{"website":"www.cnss.cn","name":"juying"},{"website":"cloud.cnss.com","name":"carbondata 中文文档"}]', '},{','};{')
语句举例二 regexp_replace 的作用是将 Json 数组两边的中括号去掉,所以使用完这个函数之后
regexp_replace(regexp_replace('[{"website":"www.cnss.cn","name":"juying"},{"website":"cloud.cnss.com","name":"carbondata 中文文档"}]', '},{','};{'),'[|]','')
如果觉得对你有所帮助。记得收藏和关注呦!(每日更新各种大数据框架)
如需转载请注明出处(创作不易请见谅)
和巨婴程序猿一起成长。让自己变得更优秀
想了解更多精彩内容,快来关注跟着巨婴去逆袭
我最近一直在思考(大数据通俗讲解)的问题,你的看法是什么呢?关注我快说出来一起交流一下吧~