背景

大数据的 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 数组的函数相关推荐

  1. Hive解析Json数组超全讲解

    在Hive中会有很多数据是用Json格式来存储的,如开发人员对APP上的页面进行埋点时,会将多个字段存放在一个json数组中,因此数据平台调用数据时,要对埋点数据进行解析.接下来就聊聊Hive中是如何 ...

  2. hive处理json数据_(转)hive中解析json数组

    hive中解析一般的json是很容易的,get_json_object就可以了. 但如果字段是json数组,比如 [{"bssid":"6C:59:40:21:05:C4 ...

  3. 学会Hive解析Json数组

    在Hive中会有很多数据是用Json格式来存储的,如开发人员对APP上的页面进行埋点时,会将多个字段存放在一个json数组中,因此数据平台调用数据时,要对埋点数据进行解析.接下来就聊聊Hive中是如何 ...

  4. Hive之解析Json数组

    目录 Hive自带的json解析函数 1.get_json_object函数 2.json_tuple函数 Hive解析json数组 一.嵌套子查询解析json数组 二.使用 lateral view ...

  5. android 数组指针异常,Android JSON解析Json数组是[]在解析时抛出空指针异常,如何以正确的方式写入?...

    我有复杂的API,我解析并显示在列表视图中,我将努力解析JSONArray.Here我将在斗争之后Json数组这是在帖子json对象"tags_name":["Activ ...

  6. js解析json数组+java对象转json字符串

    function checkoutUserlist(){ // js 解析json数组var statuslist = [{"isAvailabe":"1",& ...

  7. java解析json数组

    java解析json数组 import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; p ...

  8. 使用JS解析JSON数组

    使用js解析json数组 <SCRIPT type= "text/javascript" > 1.如果是字符串则如下: var  jsonStr =  '[{" ...

  9. html5处理json数据,js解析json数组

    js读取解析JSON类型数据 JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,采用完全独立于语言的文本格式,是理想的数据交换格式.同时,JSON是 Jav ...

最新文章

  1. yolov5转tensorrt c++
  2. codeforces round25
  3. Ubuntu的网络设置
  4. MySQL 中存储时间的最佳实践
  5. Azure 上的网站如何识别不同国家和地区的用户
  6. ubuntu 安装 cuda
  7. C语言中sizeof和strlen的区别是什么
  8. 老板总说你的报表没价值?这个动态报表神器,还有很多人不知道
  9. 刷题笔记2020-06-26
  10. Oracle11g链接提示未“在本地计算机注册“OraOLEDB.Oracle”解决方法
  11. shell 登录mysql 然后quit_MySQL 数据库简单操作
  12. 国际化标签 fmt:bundlefmt:message的使用
  13. Linux 命令(125)—— vmstat 命令
  14. python与office结合可以干什么-震惊!当Python遇到Excel后,将开启你的认知虫洞
  15. oracle pmon 多长时间,oracle 11g pmon工作内容系列一
  16. 数字逻辑练习题(九) 分析由四选一多路数据选择器构成的电路
  17. 投入产出实例matlab,基于MATLAB的投入产出分析
  18. tensorflow中的正则化函数在_『TensorFlow』正则化添加方法整理
  19. 不同手机类型该如何更换手机IP
  20. 【转】RMAN-06094: datafile 1 must be restored ID 1339439.1

热门文章

  1. c 语言八进制与十进制转换,十进制转八进制(C 语言实例-八进制与十进制相互转换)...
  2. php大纲德育,德育经验论文提纲 德育经验论文大纲如何写
  3. 教你如何下载视频在MP4,PSP,IPOD,手机上看
  4. OpenAI API参数详解
  5. IDEA快捷键(超全吐血整理)
  6. Linux ag命令的安装及使用
  7. mysql之explain详解(分析索引最佳使用)
  8. 这个有争议的软件开发方法,陪伴一代程序员走过了 18 年
  9. html link 怎么设置密码,TP-Link 无线路由器设置密码方法_设置tp link路由器的无线密码方法图解...
  10. Python如何打包exe文件?如何换成喜欢的图标?