本文参考: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 更加高效。具体是如何使用呢,下面给个实例
select
a.timestamp,
get_json_object(a.appevents, '$.eventid'),
get_json_object(a.appenvets, '$.eventname')
from log a;
可以改成如下写法:
select
a.timestamp,
b.*
from log a
lateral 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 数组-例子
select
c.*
from (
select
key['imei'] imei
,split(regexp_replace(regexp_extract(get_json_object(content, '$.data.installedAppList'),'^\\[(.+)\\]$',1),'\\}\\,\\{', '\\}\\|\\|\\{'),'\\|\\|') as applist
from dw_db.dw_interactive_ads_v3
where p_typ='8'
and p_dt = '${date}'
and key['imei'] is not null
and key['imei']!=''
and get_json_object(content, '$.data.installedAppList') is not null
and get_json_object(content, '$.data.installedAppList') !='[]'
limit 11
) t1
lateral view explode(t1.applist) b as app
lateral view json_tuple(b.app,'package','appName') c as package,appName
如果不进行上述操作,会报错: