Spark SQL 源码剖析(OptimizeIn 篇)

栏目: 编程工具 · 发布时间: 5年前

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

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

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 源码剖析(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技术分享】

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

Spark SQL 源码剖析(OptimizeIn 篇)

听说新版微信这有个好看


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

数据结构

数据结构

严蔚敏、吴伟民 / 清华大学出版社 / 2007-3-1 / 30.0

《数据结构》(C语言版)是为“数据结构”课程编写的教材,也可作为学习数据结构及其算法的C程序设计的参数教材。 本书的前半部分从抽象数据类型的角度讨论各种基本类型的数据结构及其应用;后半部分主要讨论查找和排序的各种实现方法及其综合分析比较。其内容和章节编排1992年4月出版的《数据结构》(第二版)基本一致,但在本书中更突出了抽象数据类型的概念。全书采用类C语言作为数据结构和算法的描述语言。 ......一起来看看 《数据结构》 这本书的介绍吧!

CSS 压缩/解压工具
CSS 压缩/解压工具

在线压缩/解压 CSS 代码

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具