查看原文
其他

json_tuple一定比 get_json_object更高效吗?(源码剖析)

The following article is from 数据仓库践行者 Author 小萝卜算子


热文推荐:☞ Spark性能调优:性能优化和故障处理


面对网上的一些结论,我们要有自己的判断。从源码中找真相~~


要理性的比较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字符串一定不要存的太长,太大,这样的话,不管用哪个函数,效率都不会好。



☞ 公众号后台回复Hive可领取Hive性能调优资料


关于我们


更多精彩,请戳"阅读原文"到"数仓之路"查看


关注不迷路~ 各种干货、资源定期分享


数据开发 学习小密圈


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

很高兴认识你

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存