Hive 完美解析 Json 数组的函数

背景

大数据的 ETL(Extract-Transfer-Load) 过程的 Transfer 阶段,需要对 json 串数据进行转换“拍平”处理。

亲测!超好用 ​​Hive 内置的 json 解析函数​​ 一文中详细介绍过 get_json_object 和 json_tuple 函数如何对 json 串进行有效解析,但美中不足的是这两个函数都无法解析 json 数组,只能解析单个 json 串。

这里将会介绍 Hive 中常用于 json 数组的解析函数及详细使用方法。

json数组解析:需求1

数据准备

例如:Hive中有一张 test_json 表,表中 json_data 字段的内容如下:

基于以上的 json_data 数据,现需要将以上 json 串数据解析为如下结构数据:

在进行解析之前,先来了解下面两个函数的使用方法。

函数运用

1、explode函数

语法

explode(Array|Map)

说明

explode()函数接收一个 array 或者 map 类型的数据作为输入,然后将 array 或 map 里面的元素按照每行的形式输出。

即将 Hive 一列中复杂的 array 或者 map 结构拆分成多行显示,也被称为列转行函数。

举例

array测试sql语句:

select explode(array('user_id','name','age'));

执行结果:

map测试sql语句:

select explode(map('user_id',1,'name','rocky','age',18));

执行结果:

2、regexp_replace函数

语法

regexp_replace(str A, str B, str C)

说明

语法含义:将字符串 A 中的符合正则表达式 B 的部分替换为 C。

注意:当字符串 A 中有一些特殊字符时,在正则表达式 B 中要使用转义字符。

举例

sql语句:

select regexp_replace('hello world!','\\ |\\!','');

执行结果:

3、 具体函数运用

了解 explode 函数与 regexp_replace 函数的使用规则后,现在来完成上面数据准备中提出的解析需求。

第一步解析:json数组拆分成多行

sql语句:

SELECT explode(split(
regexp_replace(
regexp_replace(
'[
{"user_id":"1","name":"小琳","age":16},
{"user_id":"2","name":"小刘","age":18},
{"user_id":"3","name":"小明","age":20}
]',
'\\[|\\]',''), 将json数组两边的中括号去掉

'\\}\\,\\{','\\}\\;\\{'), 将json数组元素之间的逗号换成分号

'\\;') 以分号作为分隔符(split函数以分号作为分隔)
);

执行结果:

第二步解析:json数组key转列字段

sql语句:

select json_tuple(json,'user_id','name','age')
from(select explode(split(
regexp_replace(
regexp_replace(
'[
{"user_id":"1","name":"小琳","age":16},
{"user_id":"2","name":"小刘","age":18},
{"user_id":"3","name":"小明","age":20}
]',
'\\[|\\]',''),
'\\}\\,\\{','\\}\\;\\{'),
'\\;')
)as json) tmp;

执行结果:

json数组解析:需求2

数据准备

例如:

Hive中有一张 data_json 表,表中 goods_id 和 str_data 字段的内容如下:

基于以上的 goods_id 和 str_data 数据,现需要将以上 json 串数据解析为如下结构数据:

在进行解析之前,先来了解下面两个函数的使用方法。

函数运用

1、 lateral view函数

说明

lateral view 用于和 split, explode 等 UDTF 一起使用,它能够将一列数据拆成多行数据,在此基础上可以对拆分后的数据进行聚合。

lateral view 首先为原始表的每行调用 UDTF,UDTF 会把一行拆分成一行或者多行,lateral view 在把结果组合,产生一个支持别名表的虚拟表。

举例

例如:Hive 中有一张 page_ads 表,表数据结构如下:

page_name 代表页面名称,ads_id 代表投放广告的所属 id,多个 id之间使用逗号分隔。

需求:统计所有广告 id 在所有页面中出现的次数。

第一步解析:拆分广告id

拆分sql语句:

SELECT page_name, ads_id 
FROM page_ads LATERAL VIEW explode(ads_id) adTable AS adid;

拆分结果:

第二步解析:聚合统计

聚合统计sql语句:

SELECT adid,count(1)
FROM page_ads LATERAL VIEW explode(ads_id) adTable AS adid
GROUPBY adid;

统计结果:

2、 具体函数运用

解析 data_json 表的sql语句如下:

select goods_id,get_json_object(sale_json,'$.sold')as sold
from data_json
LATERAL VIEW explode(split(goods_id,','))goods as goods_id
LATERAL VIEW explode(split(
regexp_replace(
regexp_replace(json_str ,'\\[|\\]',''),'\\}\\,\\{','\\}\\;\\{'),'\\;')) sales as sale_json;

注意:

上述语句是 3*3 笛卡尔积的结果,所以此方式适用于数据量不是很大的情况。

执行结果如下:

文章来源网络,作者:管理,如若转载,请注明出处:https://shuyeidc.com/wp/263470.html<

(0)
管理的头像管理
上一篇2025-05-04 14:13
下一篇 2025-05-04 14:14

相关推荐

  • 服务器租用和托管哪个性价比更高,服务器租用和托管哪个好

    对于缺乏专职运维团队的中小企业,服务器租用通常是性价比更高的选择,因为它将硬件、网络和基础维护打包成固定月费,极大降低了技术门槛和突发故障成本;而拥有资深运维人员且对硬件有深度定制需求的企业,服务器托管在长期运行中可能更经济,但需要仔细核算机房租赁、带宽采购和备件储备等隐性支出,理解服务器租用与托管的核心差异服……

    2026-07-28
    0
  • 小型企业该选云服务器还是虚拟主机,哪个更划算?

    对于小型企业,选择云服务器还是虚拟主机取决于业务阶段和需求,虚拟主机适合预算有限、流量较小的初创期,而云服务器则更适合追求稳定、安全并希望弹性扩展的成长型企业,虚拟主机与云服务器的本质差异虚拟主机本质上是多网站共享一台物理服务器的资源,廉价但性能受限,云服务器通过虚拟化技术提供独立计算单元,资源独享,可随时调整……

    2026-07-28
    0
  • 国内IDC服务商排名前十的有哪些,哪个性价比高?

    国内IDC服务商排名前十的名单中,阿里云、腾讯云、华为云、简米科技、酷番云、世纪互联、光环新网、万国数据、鹏博士和中国电信各自占据重要位置,简米科技和酷番云凭借自营机房和齐全的增值电信资质,成为中小企业和合规要求较高场景的优选,近年来,IDC市场持续增长,企业对服务的稳定性、安全性和合规性要求日益提升,据工信部……

    2026-07-28
    0
  • 站群服务器泛目录配置怎么选,哪种配置最好

    站群服务器泛目录的配置应以高并发处理能力为核心,推荐采用多核高频CPU、64GB以上内存、NVMe SSD硬盘以及支持C段独立IP的机房,同时需确保服务商具备正规资质和自营基础设施,泛目录模式依赖大量目录级访问,每个请求都需要服务器快速响应并生成页面,配置不当容易导致资源耗尽,下面从硬件、网络、机房三个层面拆解……

    2026-07-28
    0
  • 怎样才能挑选靠谱的站群服务器服务商,哪家好

    挑选靠谱的站群服务器服务商,核心在于考察其IP资源纯净度、硬件稳定性、合规资质以及售后响应速度,而非单纯比拼价格,站群服务器选购的核心痛点与避坑指南做站群业务,最怕遇到同IP连坐降权、服务器宕机断连或者服务商突然跑路,挑选服务商时,得带着放大镜看细节,把业务稳定性放在第一位,IP资源池的纯净度与丰富度站群的核心……

    2026-07-28
    0

发表回复

您的邮箱地址不会被公开。必填项已用 * 标注