天天看点

五分钟系列 | Spark3.0新特性之动态分区裁剪

Apache Spark 3.0.0 终于赶在下周二举办的 Spark Summit AI 会议之前正式发布了! Apache Spark 3.0.0 自2018年10月02日开发到目前已经经历了近21个月。

其中有几个重要的特性:

  • 动态分区修剪
  • 自适应查询执行
  • 加速器感知调度

...

今天讲的是这个动态分区修剪。

静态分区裁剪

select * from table_test where name='foo';           

复制

Spark会自动进行以下优化,先 filter再scan:

五分钟系列 | Spark3.0新特性之动态分区裁剪

这样优化后,Spark SQL处理的数据量大大减少。但是这一切都是在编译的时候进行的,所以叫做静态分区裁剪。

这也是传统数据库中所说的谓词下推。

动态分区裁剪

假如说我们有一个这样的SQL:

select table1.c1 from table1 join table2 
on table1.c1 = table2.c1 
where table2.c2 = 1;           

复制

如果不做任何优化,执行过程便是:table1和table2全表进行一次join,然后在过滤table2.c2=1。

优化后的执行过程:table2先进行一次过滤table2.c2=1,然后在和table1进行join。

当然触发动态裁剪是需要一些条件的:

  • 待剪枝的表再join条件中存在分区字段,没有分区字段肯定是剪不了枝的
  • 如果是join左边表剪枝,那么join类型必须是inner join,left semi join 或者 right join。右边剪枝则类似。这很好理解,剪枝左边表是用右边表产出的分区字段作为过滤条件。那么如果是left outer join,无论右边有没有这个分区,左边的值总是存在。因此不需要被剪枝。
  • 另一张表需要存在至少一个过滤条件,比如 a join b on a.id = b.id where b.day=1

欢迎点赞+收藏

欢迎转发至朋友圈