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 |
---|
[{"user_id":"1","name":"小琳","age":16},{"user_id":"2","name":"小刘","age":18},{"user_id":"3","name":"小明","age":20}] |
基于以上的 json_data 数据,现需要将以上 json 串数据解析为如下结构数据:
user_id | name | age |
---|---|---|
1 | 小琳 | 16 |
2 | 小刘 | 18 |
3 | 小明 | 20 |
在进行解析之前,先来了解下面两个函数的使用方法。
函数运用
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 |
---|---|
5,7,9 | [{"source":"taobao","sold":100,"remain":1000},{"source":"jd","sold":200,"remain":2000},{"source":"meituan","sold":300,"remain":3000}] |
基于以上的 goods_id 和 str_data 数据,现需要将以上 json 串数据解析为如下结构数据:
goods_id | sold |
---|---|
5 | 100 |
5 | 200 |
5 | 300 |
7 | 100 |
7 | 200 |
7 | 300 |
9 | 100 |
9 | 200 |
9 | 300 |
在进行解析之前,先来了解下面两个函数的使用方法。
函数运用
1. lateral view函数
说明
lateral view 用于和 split, explode 等 UDTF 一起使用,它能够将一列数据拆成多行数据,在此基础上可以对拆分后的数据进行聚合。
lateral view 首先为原始表的每行调用 UDTF,UDTF 会把一行拆分成一行或者多行,lateral view 在把结果组合,产生一个支持别名表的虚拟表。
举例
例如:Hive 中有一张 page_ads 表,表数据结构如下:
page_name | ads_id |
---|---|
home_page | [1,2,3] |
front_page | [2,6] |
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;
拆分结果:
page_name | ads_id |
---|---|
home_page | 1 |
home_page | 2 |
home_page | 3 |
front_page | 2 |
front_page | 6 |
第二步解析:聚合统计
聚合统计sql语句:
SELECT adid, count(1) FROM page_ads LATERAL VIEW explode(ads_id) adTable AS adid
GROUP BY adid;
统计结果:
adid | count(1) |
---|---|
1 | 1 |
2 | 2 |
3 | 1 |
6 | 1 |
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 笛卡尔积的结果,所以此方式适用于数据量不是很大的情况。
执行结果如下:
goods_id | sold |
---|---|
5 | 100 |
5 | 200 |
5 | 300 |
7 | 100 |
7 | 200 |
7 | 300 |
9 | 100 |
9 | 200 |
9 | 300 |
欢迎关注【无量测试之道】公众号,回复【领取资源】
Python+Unittest框架API自动化、
Python+Unittest框架API自动化、
Python+Pytest框架API自动化、
Python+Pandas+Pyecharts大数据分析、
Python+Selenium框架Web的UI自动化、
Python+Appium框架APP的UI自动化、
Python编程学习资源干货、
Vue前端组件化框架开发、
资源和代码 免费送啦~
文章下方有公众号二维码,可直接微信扫一扫关注即可。
备注:我的个人公众号已正式开通,致力于IT互联网技术的分享。
包含:数据分析、大数据、机器学习、测试开发、API接口自动化、测试运维、UI自动化、性能测试、代码检测、编程技术等。
微信搜索公众号:“无量测试之道”,或扫描下方二维码:
添加关注,让我们一起共同成长!
Hive 超赞的解析 Json 数组的函数相关推荐
- Hive解析Json数组超全讲解
在Hive中会有很多数据是用Json格式来存储的,如开发人员对APP上的页面进行埋点时,会将多个字段存放在一个json数组中,因此数据平台调用数据时,要对埋点数据进行解析.接下来就聊聊Hive中是如何 ...
- hive处理json数据_(转)hive中解析json数组
hive中解析一般的json是很容易的,get_json_object就可以了. 但如果字段是json数组,比如 [{"bssid":"6C:59:40:21:05:C4 ...
- 学会Hive解析Json数组
在Hive中会有很多数据是用Json格式来存储的,如开发人员对APP上的页面进行埋点时,会将多个字段存放在一个json数组中,因此数据平台调用数据时,要对埋点数据进行解析.接下来就聊聊Hive中是如何 ...
- Hive之解析Json数组
目录 Hive自带的json解析函数 1.get_json_object函数 2.json_tuple函数 Hive解析json数组 一.嵌套子查询解析json数组 二.使用 lateral view ...
- android 数组指针异常,Android JSON解析Json数组是[]在解析时抛出空指针异常,如何以正确的方式写入?...
我有复杂的API,我解析并显示在列表视图中,我将努力解析JSONArray.Here我将在斗争之后Json数组这是在帖子json对象"tags_name":["Activ ...
- js解析json数组+java对象转json字符串
function checkoutUserlist(){ // js 解析json数组var statuslist = [{"isAvailabe":"1",& ...
- java解析json数组
java解析json数组 import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; p ...
- 使用JS解析JSON数组
使用js解析json数组 <SCRIPT type= "text/javascript" > 1.如果是字符串则如下: var jsonStr = '[{" ...
- html5处理json数据,js解析json数组
js读取解析JSON类型数据 JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,采用完全独立于语言的文本格式,是理想的数据交换格式.同时,JSON是 Jav ...
最新文章
- yolov5转tensorrt c++
- codeforces round25
- Ubuntu的网络设置
- MySQL 中存储时间的最佳实践
- Azure 上的网站如何识别不同国家和地区的用户
- ubuntu 安装 cuda
- C语言中sizeof和strlen的区别是什么
- 老板总说你的报表没价值?这个动态报表神器,还有很多人不知道
- 刷题笔记2020-06-26
- Oracle11g链接提示未“在本地计算机注册“OraOLEDB.Oracle”解决方法
- shell 登录mysql 然后quit_MySQL 数据库简单操作
- 国际化标签 fmt:bundlefmt:message的使用
- Linux 命令(125)—— vmstat 命令
- python与office结合可以干什么-震惊!当Python遇到Excel后,将开启你的认知虫洞
- oracle pmon 多长时间,oracle 11g pmon工作内容系列一
- 数字逻辑练习题(九) 分析由四选一多路数据选择器构成的电路
- 投入产出实例matlab,基于MATLAB的投入产出分析
- tensorflow中的正则化函数在_『TensorFlow』正则化添加方法整理
- 不同手机类型该如何更换手机IP
- 【转】RMAN-06094: datafile 1 must be restored ID 1339439.1
热门文章
- c 语言八进制与十进制转换,十进制转八进制(C 语言实例-八进制与十进制相互转换)...
- php大纲德育,德育经验论文提纲 德育经验论文大纲如何写
- 教你如何下载视频在MP4,PSP,IPOD,手机上看
- OpenAI API参数详解
- IDEA快捷键(超全吐血整理)
- Linux ag命令的安装及使用
- mysql之explain详解(分析索引最佳使用)
- 这个有争议的软件开发方法,陪伴一代程序员走过了 18 年
- html link 怎么设置密码,TP-Link 无线路由器设置密码方法_设置tp link路由器的无线密码方法图解...
- Python如何打包exe文件?如何换成喜欢的图标?