hive解析json_hive json解析函数

本文介绍了在Hive中解析JSON数据的方法,包括get_json_object函数用于提取单个字段,json_tuple函数用于解析多个字段,以及如何结合explode、regexp_replace和split函数解析JSON数组。同时,提到了lateral view在解析JSON数组中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


一、背景

我们进行ETL(Extract-Transfer-Load)  过程中,经常会遇到从不同数据源获取的不同格式的数据,其中某些字段就是json格式,里面拼接了很多字段key和指标值value,今天讲一下如何解析出来相关数据。

二、hive 解析 json 数据函数

1、get_json_object

  • 语法:get_json_object(json_string, ‘$.key’)
  • 说明:解析json的字符串json_string,返回path指定的内容。如果输入的json字符串无效,那么返回NULL。这个函数每次只能返回一个数据项。
  • 优势:一次可以解析一个json字段
select 
    get_json_object('{"user_name":"chimchim","age":30}', '$.user_name') as user_name,
    get_json_object('{"user_name":"chimchim","age":30}', '$.age')       as age

2、json_tuple

  • 语法: json_tuple(json_string, k1, k2 …)
  • 说明:解析json的字符串json_string,可指定多个json数据中的key,返回对应的value。如果输入的json字符串无效,那么返回NULL。
  • 优势:一次可以解析多个json字段
select json_tuple('{"user_name":"chimchim","age":30,"sex":"woman"}', 'user_name', 'age','sex') 

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;

explode函数

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

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"}', ',', ';');

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;

解析后

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;

使用 lateral view 解析json数组

--第一种写法
select 
     get_json_object(tmp,'$.user_name') as user_name
    ,get_json_object(tmp,'$.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;

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数大数据工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年大数据全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上大数据开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加VX:vip204888 (备注大数据获取)
img

发知识点,真正体系化!**

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加VX:vip204888 (备注大数据获取)
[外链图片转存中…(img-kgvbnXzU-1712847301584)]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值