在写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写法很优雅,但是效率并不一定高哦相关推荐

  1. 学会Hive解析Json数组

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

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

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

  3. Hive中解析Json字段、json日志分析所用到的嵌套json解析

    首先在百度搜索,json格式解析,将这段话变个格式看起来舒服. 然后,通过通过嵌套使用json函数解决.大概就是将内层的json字段当作一个整体,然后先将这个外层作为解析.在通过子查询使用方法,在外套 ...

  4. hive解析json

    -- json数据 {"OTHER_INFO":{"MOBILE_ADDR":"四川省内江市潘咱陛路1233号闷羞小区19单元484室",& ...

  5. Hive解析Json格式用户日志

    解析json格式数据 Json数据 HIVE SQL解析 第一种方式 第二种方式 第三种方式 string类型的数组形式的行转列拆分 Json数据 第一次写博客,mark一下 --20191025 下 ...

  6. sql解析json字段

    MySQL自5.7之后开始支持json类型,相应的解析函数主要是json_extract(); 查询sql版本:select version(); JSON_EXTRACT()函数用于从JSON中提取 ...

  7. hive解析json数组

    前言 解析如下数组 获取app_name和 app_type 字段 [{"app_name":"Kloningponsel","app_type&qu ...

  8. hive - 解析 json

    内置函数:get_json_object(json串,解析路径) 解析路径说明: $ :跟对象 . :子对象 [] :数组下标 * :所有 举例: 数据样例: {"movie":& ...

  9. Hive提取json字段信息

    有一个函数可以用于处理json数据,如下 其中第一个参数为待处理的字符串 第二个参数为要提取内容的key selectget_json_object('{"target_type" ...

最新文章

  1. linux shell脚本if,linux的shell脚本中if,for,while的解析与应用
  2. Facebook欧盟垄断案陷入灰色地带 立法或调整
  3. java mvc 批量插入_请教mysql spring mvc +mybatis中批量插入的问题?
  4. 【Linux】一步一步学Linux——indent命令(262)
  5. 我的Go语言学习之旅七:创建一个GUI窗体
  6. leetcode —— 979. 在二叉树中分配硬币
  7. 平面直角坐标系中的旋转公式_初一下学期,平面直角坐标系中求图形面积,转化与化归思想的体现...
  8. 腾讯手机管家(pc版) for android,腾讯手机管家PC版for Android小技巧分享
  9. sql server分组排序
  10. 数模论文写作方法1|标题确立
  11. python str和repr的区别_python str与repr的区别
  12. 研发人员一些比较重要的能力指标参考
  13. 2.Paper小结——《Privacy-preserving blockchain-based federated learning for traffic flow prediction》
  14. java拆分_Java 拆分 PDF 文档
  15. JavaScript进阶篇③ — 浏览器对象、Dom对象
  16. 淘宝标题优化词根优化方法技巧 什么是淘宝标题词根
  17. 史上最全整理:大投机家 杰西·利弗莫尔 投资原则及启示(期货股票交易者必收藏)
  18. coresite美国数据中心你了解多少?
  19. 通达信自动提示穿头破脚K线组合形态(含指标公式源码)
  20. Data Import Handler - DIH相关命令

热门文章

  1. Dockerfile + docker-compose 一键部署 前后端+中间件
  2. XCode描述文件的路径
  3. Firework data processing framework
  4. php 接口响应头处理,PHP--获取响应头(Response Header)方法
  5. ERROR 1813 -Mysql:Tablespace for table 'xxx`.'xxx` exists.
  6. A Self-Attentive model for Knowledge Tracing
  7. 有人说,Linux 发行版激增不利于 Linux 生态系统?
  8. 机器人最新天赋符文天赋加点图_LOLS6新版机器人怎么点天赋 新版机器人天赋符文攻略...
  9. 小米手环4 连接win10笔记本小米感应钥匙绑定失败 解决方法,亲测有效!
  10. java微信群自动回复_微信群怎么设置自动回复的小助手?看这一份攻略就够了...