本文参考:https://cwiki.apache.org/confluence/display/Hive/LanguageManual+UDF

获取单个属性值

get_json_object

hive中解析一般的json是很容易的,使用 get_json_object 就可以了。 get_json_object 函数第一个参数填写json对象变量,第二个参数使用$表示json变量标识,然后用 . 或 [] 读取对象或数组;

例子:

  1. select get_json_object('{"name":"jack","server":"www.qq.com"}','$.server')

一次性获取多个属性值

json_tuple

对与返回多个字段的场景,它比 json_tuple 更加高效。具体是如何使用呢,下面给个实例

  1. select
  2. a.timestamp,
  3. get_json_object(a.appevents, '$.eventid'),
  4. get_json_object(a.appenvets, '$.eventname')
  5. from log a;

可以改成如下写法:

  1. select
  2. a.timestamp,
  3. b.*
  4. from log a
  5. lateral view json_tuple(a.appevent, 'eventid', 'eventname') b as f1, f2;

解析 Json 数组

explode

如果字段是 json 数组,比如

  1. [{"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)

  1. select explode(array('A','B','C')) as col;
  2. select tf.* from (select 0 from dual) t lateral view explode(array('A','B','C')) tf as col;

运行结果:

col 1
C
B
C

查看,下面的 json 数组

  1. [{"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 数组-例子

  1. select
  2. c.*
  3. from (
  4. select
  5. key['imei'] imei
  6. ,split(regexp_replace(regexp_extract(get_json_object(content, '$.data.installedAppList'),'^\\[(.+)\\]$',1),'\\}\\,\\{', '\\}\\|\\|\\{'),'\\|\\|') as applist
  7. from dw_db.dw_interactive_ads_v3
  8. where p_typ='8'
  9. and p_dt = '${date}'
  10. and key['imei'] is not null
  11. and key['imei']!=''
  12. and get_json_object(content, '$.data.installedAppList') is not null
  13. and get_json_object(content, '$.data.installedAppList') !='[]'
  14. limit 11
  15. ) t1
  16. lateral view explode(t1.applist) b as app
  17. lateral view json_tuple(b.app,'package','appName') c as package,appName

如果不进行上述操作,会报错:
image.png