select json_tuple(‘{“user_name”:“chimchim”,“age”:30,“sex”:“woman”}’, ‘user_name’, ‘age’,‘sex’)

hive判断json有某个key hive中json解析_hadoop

3、使用嵌套子查询(**explode+regexp_replace+split+**json_tuple)解析json数组

select json_tuple(json, ‘user_name’, ‘age’, ‘sex’)
 from (
 select explode( --将json数组中的元素解析出来,转化为每行显示
 split(regexp_replace(regexp_replace(
 ‘[{“user_name”:“chimchim”,“age”:30,“sex”:“woman”},{“user_name”:“zonzon”,“age”:2,“sex”:“man”}]’ --要解析的json内容
 , ‘\[|\]’, ‘’) --将json数组两边的中括号去掉
 ,‘\}\,\{’, ‘\}\;\{’) --将json数组元素之间的逗号换成分号
 , ‘\;’)) --以分号作为分隔符(split函数以分号作为分隔)
 as json) o;

hive判断json有某个key hive中json解析_数据_02

explode函数

  • 语法:explode(Array OR Map)
  • 说明:explode()函数接收一个array或者map类型的数据作为输入,然后将array或map里面的元素按照每行的形式输出,即将hive一列中复杂的array或者map结构拆分成多行显示,也被称为列转行函数。

select array(‘A’,‘B’,‘C’) ;

hive判断json有某个key hive中json解析_json_03

regexp_replace函数

  • 语法: regexp_replace(string A, string B, string C)
  • 说明:将字符串A中的符合java正则表达式B的部分替换为C。注意,在有些情况下要使用转义字符,类似oracle中的regexp_replace函数。

–将,替换为;
select regexp_replace(‘{“user_name”:“chimchim”,“age”:30,“sex”:“woman”}’, ‘,’, ‘;’);

hive判断json有某个key hive中json解析_hive判断json有某个key_04

4、使用 lateral view 解析json数组

lateral view

说明:lateral view用于和split、explode等UDTF一起使用的,能将一行数据拆分成多行数据,在此基础上可以对拆分的数据进行聚合,lateral view首先为原始表的每行调用UDTF,UDTF会把一行拆分成一行或者多行,lateral view在把结果组合,产生一个支持别名表的虚拟表。

原始数据

select ‘chimchim’ as user_name,array(“a”,“b”,“c”) as class;

hive判断json有某个key hive中json解析_hive_05

解析后

select user_name,class_str
from (select ‘chimchim’ as user_name,array(“a”,“b”,“c”) as class) a
lateral view explode(class) tmp_table as class_str;

hive判断json有某个key hive中json解析_数据_06

使用 lateral view 解析json数组

–第一种写法
select
get_json_object(tmp,‘hive判断json有某个key hive中json解析_hadoop_07.age’) as age
,get_json_object(tmp,‘$.sex’) as sex
from (select ‘[{“user_name”:“chimchim”,“age”:30,“sex”:“woman”},{“user_name”:“zonzon”,“age”:2,“sex”:“man”}]’ as json_str) a
lateral view explode(split(regexp_replace(regexp_replace(json_str , ‘\[|\]’,‘’),‘\}\,\{’,‘\}\;\{’),‘\;’)) tmp as tmp;

hive判断json有某个key hive中json解析_数据_08