本文参考:https://cwiki.apache.org/confluence/display/Hive/LanguageManual+UDF
获取单个属性值
get_json_object
hive中解析一般的json是很容易的,使用 get_json_object 就可以了。
get_json_object 函数第一个参数填写json对象变量,第二个参数使用$表示json变量标识,然后用 . 或 [] 读取对象或数组;
例子:
select get_json_object('{"name":"jack","server":"www.qq.com"}','$.server')
一次性获取多个属性值
json_tuple
对与返回多个字段的场景,它比 json_tuple 更加高效。具体是如何使用呢,下面给个实例
selecta.timestamp,get_json_object(a.appevents, '$.eventid'),get_json_object(a.appenvets, '$.eventname')from log a;
可以改成如下写法:
selecta.timestamp,b.*from log alateral view json_tuple(a.appevent, 'eventid', 'eventname') b as f1, f2;
解析 Json 数组
explode
如果字段是 json 数组,比如
[{"bssid":"6C:59:40:21:05:C4"},{"bssid":"AC:9C:E4:04:EE:52","ssid":"and-Business"}]
直接调用 get_json_object 返回空值。这样的话对于不会写UDF的同学来说,解析json数组就变得很棘手,好在 hive 中自带了 explode 函数,从而让解析 json数组 变得有可能了。这里先介绍一下 explode 的使用方法:
explode(array)
select explode(array('A','B','C')) as col;select tf.* from (select 0 from dual) t lateral view explode(array('A','B','C')) tf as col;
运行结果:
| col 1 |
|---|
| C |
| B |
| C |
查看,下面的 json 数组
[{"bssid":"6C:59:40:21:05:C4","ssid":"MERCURY_05C4"},{"bssid":"AC:9C:E4:04:EE:52","appid":"10003","ssid":"and-Business"}],
怎么解析出bssid?
思路是通过 explode 把原数据变成2行数据({“bssid”:”6C:59:40:21:05:C4”,”ssid”:”MERCURY_05C4”}和{“bssid”:”AC:9C:E4:04:EE:52”,”appid”:”10003”,”ssid”:”and-Business”}),然后再使用get_json_object解析。
具体代码如下:
select ss.col
from (
select split(regexp_replace(regexp_extract(‘[{“bssid”:”6C:59:40:21:05:C4”,”ssid”:”MERCURY_05C4”},{“bssid”:”AC:9C:E4:04:EE:52”,”appid”:”10003”,”ssid”:”and-Business”}]’,’^\[(.+)\]$’,1),’\}\,\{‘, ‘\}\|\|\{‘),’\|\|’) as str
from dual) pp
lateral view explode(pp.str) ss as col ;
运行结果:
col
{“bssid”:”AC:9C:E4:04:EE:52”,”appid”:”10003”,”ssid”:”and-Business”}
{“bssid”:”6C:59:40:21:05:C4”,”ssid”:”MERCURY_05C4”}
说明:因为原数据是string(并不是真正的数组类型)类型的,所以无法直接使用explode函数。
1.regexp_extract(‘xxx’,’^\[(.+)\]$’,1) 这里是把需要解析的json数组去除左右中括号,需要注意的是这里的中括号需要两个转义字符\[。
2.regexp_replace(‘xxx’,’\}\,\{‘, ‘\}\|\|\{‘) 把json数组的逗号分隔符变成两根竖线||,可以自定义分隔符只要不在json数组项出现就可以。
3.使用split函数返回的数组,分隔符为上面定义好的。
4.lateral view explode处理3中返回的数组。
另外,hive中的json_tuple解析json比get_json_object更方便。
参考:
作者:断剑1989
来源:CSDN
原文:https://blog.csdn.net/djz19890117/article/details/79165281
版权声明:本文为博主原创文章,转载请附上博文链接!
解析 json 数组-例子
selectc.*from (selectkey['imei'] imei,split(regexp_replace(regexp_extract(get_json_object(content, '$.data.installedAppList'),'^\\[(.+)\\]$',1),'\\}\\,\\{', '\\}\\|\\|\\{'),'\\|\\|') as applistfrom dw_db.dw_interactive_ads_v3where p_typ='8'and p_dt = '${date}'and key['imei'] is not nulland key['imei']!=''and get_json_object(content, '$.data.installedAppList') is not nulland get_json_object(content, '$.data.installedAppList') !='[]'limit 11) t1lateral view explode(t1.applist) b as applateral view json_tuple(b.app,'package','appName') c as package,appName
如果不进行上述操作,会报错:
