关注 spark技术分享,
撸spark源码 玩spark最佳实践

spark sql 源码剖析 OptimizeIn 篇

spark sql 的优化框架 Catalyst 博大精深,里面的精华是很多大牛一个pr一个pr积累起来的,仔细琢磨琢磨相关源码也是一件痛并快乐的事情,今天我来抛砖引玉,讲讲 逻辑优化里面 OptimizeIn 的实现原理,如果对 spark sql 总体架构不了解的,可以先看这篇文章 是时候学习真正的spark技术了 了解全貌。

关键词请忽略:spark sql内核剖析pdf spark源码分析 spark 2.0源码分析 spark sql流程 spark sql action spark sql parser spark core源码分析 spark sql execute plan spark sql内核剖析pdf spark源码分析 spark 2.0源码分析 spark sql流程 spark sql parser spark sql action spark sql ast spark dataframe row spark core源码分析 spark sql execute plan

OptimizeIn 的优化方式相对简单,所以今天这篇文章的篇幅应该比较短,大家理解起来也相对轻松,当然目的只有一个,就是带动大家看源码的热情,我们先来测试个例子:

spark sql 源码剖析 OptimizeIn 篇

这个例子很简单,我们就是建一个表, 表有3个字段 a,b,c  里面包含3条数据:

spark sql 源码剖析 OptimizeIn 篇

下面我们对比OptimizeIn 优化策略使用前和使用后的变化

spark sql 源码剖析 OptimizeIn 篇

spark sql 源码剖析 OptimizeIn 篇

可以看到, Filter 节点谓词表达式从 a#7 IN (a1,a2,a1)  变为了 a#7 IN (a1,a2) ,   其实这个变化不大,只是对 list 中的原始去重了,但是仍然是list类型,sql中谓词的判断还是要去遍历list,然后一个元素一个元素的去判断。这个主要的原因是有一个阈值,低于这个阈值就不转换为 HashSet, 毕竟元素太少了嘛,也没必要,这个配置是 spark.sql.optimizer.inSetConversionThreshold,默认值是 10 , 我们可以修改一下这个配置,然后再测试一下

关键词请忽略:spark sql内核剖析pdf spark源码分析 spark 2.0源码分析 spark sql流程 spark sql action spark sql parser spark core源码分析 spark sql execute plan spark sql内核剖析pdf spark源码分析 spark 2.0源码分析 spark sql流程 spark sql parser spark sql action spark sql ast spark dataframe row spark core源码分析 spark sql execute plan

spark sql 源码剖析 OptimizeIn 篇

spark sql 源码剖析 OptimizeIn 篇

你会发现Filter 节点里面的谓词表达式变为了 a#7 INSET (a1,a2),这种情况使用hashSet 数据结构提升性能,这个在元素比较多的情况下,意义巨大。

 

按照我之前的原则,我一般不会贴源码,因为这个优化策略实现代码比较少,我就直接贴一下:

spark sql 源码剖析 OptimizeIn 篇

我们来分析一下这段代码,首先向下遍历所有的表达式,进行匹配处理,如果match 到相应的模式,就使用新的表达式替换匹配到的表达式。

首先第一种情况,在 list 为空的情况下,替换为一种 If 表达式,

这时候如果 字段的值为空,就返回一个null的常量,这种情况就是

 select xxx from t where null  in ()

如果不会空,就直接把 Filter的谓词赋值为Flase, 这样对每一行就直接返回一个 False, 全部过滤掉,提升了性能

select xxx from t where x in () –> select xxx from t  where flase

下面是在 list 不为空的情况下,首先新建了一个 newList, 这个是一个表达式的 Set, 怎么理解呢,常量在sql中也是表达式,对于我们的例子:

spark sql 源码剖析 OptimizeIn 篇

我们来看下list 不为空的处理流程:

  • 如果 newList 长度为1, In 表达式直接转换为判断和这唯一元素是否相等的EqualTo表达式
  • 如果 newList  大于 spark.sql.optimizer.inSetConversionThreshold 配置的值,In表达式转变为 InSet 表达式,使用 hashSet 数据结构提升性能
  • 如果 newList 长度小于原来的list长度相等,也就意味中有重复元素,这时候In 表达式转变为一个 元素更少的 In 表达式,这种情况判断方式和原来一样,也是遍历list,一个元素一个元素的去比较
  • 如果newList 长度等于原来的list长度相等,就啥也不变

 

这个OptimizeIn 的逻辑蛮简单的,可以作为一个简单的例子学习一下。

 

关键词请忽略:spark sql内核剖析pdf spark源码分析 spark 2.0源码分析 spark sql流程 spark sql action spark sql parser spark core源码分析 spark sql execute plan spark sql内核剖析pdf spark源码分析 spark 2.0源码分析 spark sql流程 spark sql parser spark sql action spark sql ast spark dataframe row spark core源码分析 spark sql execute plan

大家都在看

spark sql源码系列:

是时候学习真正的spark技术了从0到1认识 spark sqlspark sql 源码剖析 PushDownPredicate

structured streaming 系列:

structured streaming 原理剖析structured streaming 碰上kafkastructured streaming 是如何搞定乱序时间的

spark streaming 系列:

spark streaming 读取kafka各种姿势详解spark streaming流式计算中的困境与解决之道

spark core 系列:

彻底搞懂spark shuffle过程(1)彻底搞懂spark shuffle过程(2)spark内存管理-Tungsten框架探秘

spark 机器学习系列

关注【spark技术分享】

一起撸spark源码,一起玩spark最佳实践

spark sql 源码剖析 OptimizeIn 篇

听说新版微信这有个好看


原文始发于微信公众号(spark技术分享):spark sql 源码剖析 OptimizeIn 篇

赞(0) 打赏
未经允许不得转载:spark技术分享 » spark sql 源码剖析 OptimizeIn 篇
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

关注公众号:spark技术分享

联系我们联系我们

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏