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

相关推荐

  • 个人主题怎么制作?

    制作个人主题是一个将个人风格、兴趣或专业领域转化为视觉化或结构化内容的过程,无论是用于个人博客、作品集、社交媒体账号还是品牌形象,核心都是围绕“个人特色”展开,以下从定位、内容规划、视觉设计、技术实现四个维度,详细拆解制作个人主题的完整流程,明确主题定位:找到个人特色的核心主题定位是所有工作的起点,需要先回答……

    2025-11-20
    0
  • 社群营销管理关键是什么?

    社群营销的核心在于通过建立有温度、有价值、有归属感的社群,实现用户留存、转化和品牌传播,其管理需贯穿“目标定位-内容运营-用户互动-数据驱动-风险控制”全流程,以下从五个维度展开详细说明:明确社群定位与目标社群管理的首要任务是精准定位,需明确社群的核心价值(如行业交流、产品使用指导、兴趣分享等)、目标用户画像……

    2025-11-20
    0
  • 香港公司网站备案需要什么材料?

    香港公司进行网站备案是一个涉及多部门协调、流程相对严谨的过程,尤其需兼顾中国内地与香港两地的监管要求,由于香港公司注册地与中国内地不同,其网站若主要服务内地用户或使用内地服务器,需根据服务器位置、网站内容性质等,选择对应的备案路径(如工信部ICP备案或公安备案),以下从备案主体资格、流程步骤、材料准备、注意事项……

    2025-11-20
    0
  • 如何企业上云推广

    企业上云已成为数字化转型的核心战略,但推广过程中需结合行业特性、企业痛点与市场需求,构建系统性、多维度的推广体系,以下从市场定位、策略设计、执行落地及效果优化四个维度,详细拆解企业上云推广的实践路径,精准定位:明确目标企业与核心价值企业上云并非“一刀切”的方案,需先锁定目标客户群体,提炼差异化价值主张,客户分层……

    2025-11-20
    0
  • PS设计搜索框的实用技巧有哪些?

    在PS中设计一个美观且功能性的搜索框需要结合创意构思、视觉设计和用户体验考量,以下从设计思路、制作步骤、细节优化及交互预览等方面详细说明,帮助打造符合需求的搜索框,设计前的规划明确使用场景:根据网站或APP的整体风格确定搜索框的调性,例如极简风适合细线条和纯色,科技感适合渐变和发光效果,电商类则可能需要突出搜索……

    2025-11-20
    0

发表回复

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