json_tuple一定比 get_json_object更高效吗?

​要理性的比较json_tuple和get_json_object的效率,最近有朋友问我:hive中取多个key时,为什么用了json_tuple,效率反而比get_json_object慢了一些?

先看一下网上的结论:

上面是搜索网上的结论的截图,基本都会认为json_tuple比get_json_object高效,理由是:取多个key值时,json_tuple只解析一次,而get_json_object需要解析多次。

我们来看实际情况:

1、get_json_object缓存jsonObject (并非无脑解析多次)

 

一般情况下,由json字符串序列化成jsonObject这个过程是最耗费时间的。从代码中可以看到,get_json_object函数会缓存jsonObject,也就是说json字符串转化为jsonObject的过程只有一次。并不是解析多次。

2、执行计划层面(get_json_object更简洁,json_tuple更繁重)

从下图中可以看到,get_json_object的执行计划,只有一个selectOperator ,非常简单

而json_tuple是属于udtf函数,中间会有udtf相关的operator

详情可以参考:你真的了解Lateral View explode吗?  这篇

执行计划图大概是这个样子:

图是从 你真的了解Lateral View explode吗? 中取的,不太合适,但基本流程是一样的

json_tuple在这个过程中也是有一定的性能损耗的

3、从功能多样性来看(这个和性能无关啦)

get_json_object方法可以处理的 path更为丰富,能够支持正则、支持嵌套、取多层等。

而json_tuple简单粗暴,只能解析第一层key

 

以上,我们在实际用的时候,不要盲从,用get_json_object也是没关系的,况且正常情况下,一次也不会取成千上万个key值... 重要的是要保证,我们的json字符串一定不要存的太长,太大,这样的话,不管用哪个函数,效率都不会好

Hey!

我是小萝卜算子

在成为最厉害最厉害最厉害的道路上

很高兴认识你

推荐阅读:

with as 语句真的会把查询的数据存内存嘛?

SparkSql LogicalPlan的resolved变量

Spark sql 生成PhysicalPlan(源码详解)

一文搞懂 Maven 原理

AstBuilder.visitTableName详解

从一个sql任务理解spark内存模型

Spark sql规则执行器RuleExecutor(源码解析)

spark sql解析过程中对tree的遍历(源码详解)

你真的了解Lateral View explode吗?--源码复盘

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小萝卜算子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值