在使用Hive搭建数据仓库,处理数据时,同传统数仓的结构化数据不同,我们经常会遇到一些非结构化的数据,json格式的字符串就是常见的一种类型。
对于简单的json字符串,Hive提供了get_json_object函数用来提取字符串中的相应信息,但如果遇到如下样式的json字符串数组
[{"disttype":"直线","placeid":'abcdef',"place":"距景点A直线xxx米 · xx山风景区外","motivateinfo":"","labels":"游玩|休闲|"},
{"disttype":"直线","placeid":'hijklmn',"place":"距景点A直线xxy米 · xx山风景区外","motivateinfo":"","labels":"低价|亲子|"}]
此时就需要explode函数来处理这种情况;
下面先上代码,然后再分步讲解:
select m.d,j.info,get_json_object(j.info,'$.placeid') hotelid,
get_json_object(j.info,'$.labels') tag
from (select d,split(regexp_replace(regexp_extract(
'[{"disttype":"直线","placeid":'abcdef',"place":"距景点A直线xxx米 · xx山风景区外","motivateinfo":"","labels":"游玩|休闲|"},
{"disttype":"直线","placeid":'hijklmn',"place":"距景点A直线xxy米 · xx山风景区外","motivateinfo":"","labels":"低价|亲子|"}]',
'\\}\\,\\{','\\}\\|\\|\\{'),
'\\|\\|') info_array
from table) m
lateral view explode(info_array) j as info;
说明:
- explode函数要求参数必须是array或者map类型,所以需要先把字符串转成array
- regexp_extract('xxx','^\[(.+)\]$',1) 这里是把需要解析的json数组去除左右中括号,需要注意的是这里的中括号需要两个转义字符\[。
- regexp_replace('xxx','\}\,\{', '\}\|\|\{') 把json数组的逗号分隔符变成两根竖线||,可以自定义分隔符只要不在json数组项出现就可以。
- 使用split函数返回的数组,分隔符为上面定义好的。
- lateral view explode处理3中返回的数组
- 然后就可以使用get_json_object或者json_tuple来一条条处理json数据了