Hive解析json字段,虽然json_tuple写法很优雅,但是效率并不一定高哦
在写Hive SQL时,需要从一个json列中解析出多个key的信息,查阅资料发现到有两种写法,一种是get_json_object,另外一种是json_tuple。两种用法的示例如下所示
get_json_object示例:
select get_json_object(json_str_column,'$.a1') as a1, get_json_object(json_str_column,'$.a2') as a2, get_json_object(json_str_column,'$.a3') as a3, from my_table;
json_tuple示例:
select B.a1, B.a2, B.a3 from my_table A lateral view json_tuple(json_str_column, 'a1', 'a2', 'a3') B as a1, a2, a3;
从写法上来说,json_tuple的写法SQL语句更少,更加的优雅,尤其当要解析出来的字段非常多时更加明显,但是json_tuple的性能如何呢?
再使用explain看下它们的执行计划:
两者的执行计划分别如下图所示:
get_json_object() 是个UDF,在Mapper阶段的列投影时完成获取解析json的操作,如果要获取多个key,那么json字段就要解析多次!
json_tuple() 这个函数在Hive里面是使用UDTF来实现的,即普通的一行转多行。它会生成两个Select Operator 操作,一个扫描不用解析的数据,生成一行,另外一个扫描需要解析的数据进行解析,然后再使用Lateral View Join Operator 操作将这两部分数据join关联起来。如下图所示:
LateralViewJoinOperator:
但是这里的Join并不是真正会触发Shuffle的join,只是讲非UDTF和UDTF字段通过ArrayList的addAll()连接在一起而已:
// acc is short for accumulator. It's used to build the row before forwarding ArrayList<Object> acc = new ArrayList<Object>(); // selectObjs hold the row from the select op, until receiving a row from // the udtf op ArrayList<Object> selectObjs = new ArrayList<Object>();/*** An important assumption for processOp() is that for a given row from the* TS, the LVJ will first get the row from the left select operator, followed* by all the corresponding rows from the UDTF operator. And so on.*/ @Override public void process(Object row, int tag) throws HiveException {StructObjectInspector soi = (StructObjectInspector) inputObjInspectors[tag];if (tag == SELECT_TAG) {selectObjs.clear();selectObjs.addAll(soi.getStructFieldsDataAsList(row));} else if (tag == UDTF_TAG) {acc.clear();// 这里就是所谓的join,只是连接再一起而已acc.addAll(selectObjs);acc.addAll(soi.getStructFieldsDataAsList(row));forward(acc, outputObjInspector);} else {throw new HiveException("Invalid tag");}}
最后说下个人测试得出来的结论,感觉非常神奇,如果json字段并不是特别多(几十个Key),并且从json字段中解析的key并不是特别多时,json_tuple的性能要远低于get_json_object!
非常神奇...暂时还是不明白为啥json_tuple会慢,先记录下,后续慢慢分析好了...如果又知道的,麻烦和我说一下,感谢感谢!
参考:
https://www.cnblogs.com/BlueSkyyj/p/9720346.html(get_json_object使用方式)
https://www.cnblogs.com/zzhangyuhang/p/9791795.html(lateral view介绍)
https://zhuanlan.zhihu.com/p/137482744(LateralViewJoinOperator解析)
https://blog.csdn.net/lidongmeng0213/article/details/110877351(LateralViewJoinOperator解析)
Hive解析json字段,虽然json_tuple写法很优雅,但是效率并不一定高哦相关推荐
- 学会Hive解析Json数组
在Hive中会有很多数据是用Json格式来存储的,如开发人员对APP上的页面进行埋点时,会将多个字段存放在一个json数组中,因此数据平台调用数据时,要对埋点数据进行解析.接下来就聊聊Hive中是如何 ...
- Hive解析Json数组超全讲解
在Hive中会有很多数据是用Json格式来存储的,如开发人员对APP上的页面进行埋点时,会将多个字段存放在一个json数组中,因此数据平台调用数据时,要对埋点数据进行解析.接下来就聊聊Hive中是如何 ...
- Hive中解析Json字段、json日志分析所用到的嵌套json解析
首先在百度搜索,json格式解析,将这段话变个格式看起来舒服. 然后,通过通过嵌套使用json函数解决.大概就是将内层的json字段当作一个整体,然后先将这个外层作为解析.在通过子查询使用方法,在外套 ...
- hive解析json
-- json数据 {"OTHER_INFO":{"MOBILE_ADDR":"四川省内江市潘咱陛路1233号闷羞小区19单元484室",& ...
- Hive解析Json格式用户日志
解析json格式数据 Json数据 HIVE SQL解析 第一种方式 第二种方式 第三种方式 string类型的数组形式的行转列拆分 Json数据 第一次写博客,mark一下 --20191025 下 ...
- sql解析json字段
MySQL自5.7之后开始支持json类型,相应的解析函数主要是json_extract(); 查询sql版本:select version(); JSON_EXTRACT()函数用于从JSON中提取 ...
- hive解析json数组
前言 解析如下数组 获取app_name和 app_type 字段 [{"app_name":"Kloningponsel","app_type&qu ...
- hive - 解析 json
内置函数:get_json_object(json串,解析路径) 解析路径说明: $ :跟对象 . :子对象 [] :数组下标 * :所有 举例: 数据样例: {"movie":& ...
- Hive提取json字段信息
有一个函数可以用于处理json数据,如下 其中第一个参数为待处理的字符串 第二个参数为要提取内容的key selectget_json_object('{"target_type" ...
最新文章
- linux shell脚本if,linux的shell脚本中if,for,while的解析与应用
- Facebook欧盟垄断案陷入灰色地带 立法或调整
- java mvc 批量插入_请教mysql spring mvc +mybatis中批量插入的问题?
- 【Linux】一步一步学Linux——indent命令(262)
- 我的Go语言学习之旅七:创建一个GUI窗体
- leetcode —— 979. 在二叉树中分配硬币
- 平面直角坐标系中的旋转公式_初一下学期,平面直角坐标系中求图形面积,转化与化归思想的体现...
- 腾讯手机管家(pc版) for android,腾讯手机管家PC版for Android小技巧分享
- sql server分组排序
- 数模论文写作方法1|标题确立
- python str和repr的区别_python str与repr的区别
- 研发人员一些比较重要的能力指标参考
- 2.Paper小结——《Privacy-preserving blockchain-based federated learning for traffic flow prediction》
- java拆分_Java 拆分 PDF 文档
- JavaScript进阶篇③ — 浏览器对象、Dom对象
- 淘宝标题优化词根优化方法技巧 什么是淘宝标题词根
- 史上最全整理:大投机家 杰西·利弗莫尔 投资原则及启示(期货股票交易者必收藏)
- coresite美国数据中心你了解多少?
- 通达信自动提示穿头破脚K线组合形态(含指标公式源码)
- Data Import Handler - DIH相关命令
热门文章
- Dockerfile + docker-compose 一键部署 前后端+中间件
- XCode描述文件的路径
- Firework data processing framework
- php 接口响应头处理,PHP--获取响应头(Response Header)方法
- ERROR 1813 -Mysql:Tablespace for table 'xxx`.'xxx` exists.
- A Self-Attentive model for Knowledge Tracing
- 有人说,Linux 发行版激增不利于 Linux 生态系统?
- 机器人最新天赋符文天赋加点图_LOLS6新版机器人怎么点天赋 新版机器人天赋符文攻略...
- 小米手环4 连接win10笔记本小米感应钥匙绑定失败 解决方法,亲测有效!
- java微信群自动回复_微信群怎么设置自动回复的小助手?看这一份攻略就够了...