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:
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiAjM2EzLcd3LcJzLcJzdllmVldWYtl2PnVGcq5iYxxmczdHciNXYvwlNwQzMzkDNtUGall3LcVmdhNXLwRHdo9CXt92YucWbpRWdvx2Yx5yazF2Lc9CX6MHc0RHaiojIsJye.jpeg)
这样优化后,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
欢迎点赞+收藏
欢迎转发至朋友圈