Spark-Apache Spark3.0.Dynamic Partition Pruning

静态分区裁剪[Static Partition Pruning]

用过Spark的同学知道,SparkSQL在查询的时候支持分区裁剪,比如:
select * from Sales where day_of_week = ‘Mon’

Spark会自动进行以下的优化:
Spark-Apache Spark3.0.Dynamic Partition Pruning_第1张图片
从上图可以看到
Spark在编译SQL的时候自动将Filter算子下推到数据源,也就是在Scan前进行了Filter操作,将day_of_week = 'Mon’的数据全部拿出,其它数据不需要拿出,这样SparkSQL中处理的数据就会变少了,整个SQL的查询速度就会变快,这一切都是编译时候[Compile Time]进行的,所以这个叫做Static Partition Pruning
上面的SQL查询在Spark进行了算子下推,已经能够满足我们的查询性能的提升,但是现实世界数据的查询一般不会这么简单,比如下述语句:

select * from Sales join Date where Date.day_of_week = ‘Mon’

比较差的查询引擎是这么做的:
Spark-Apache Spark3.0.Dynamic Partition Pruning_第2张图片
从上图可以看出,查询引擎直接忽略了Date.day_of_week = 'Mon’这个过滤条件,上来就是两表join,然后join的结果在进行过滤,这个可能导致会进行很多无效的计算,如果Date.day_of_week = 'Mon’可以过滤大量的无用数据,肯定可以提升查询性能。在Spark SQL里能够很好处理这种情况,它会把Date.day_of_week = 'Mon’过滤条件下推到Date表的Scan之前进行:
Spark-Apache Spark3.0.Dynamic Partition Pruning_第3张图片


动态分区裁剪[Dynamic Partition Pruning]

上面SparkSQL进行的算子下推是否能再提升查询性能,是否可以通过一种更好的方法过滤掉一些无用的数据?这里就可以用到动态分区裁剪,这个功能是Spark3.0引入的
动态分区裁剪:基于运行时推断出来的信息来进一步进行分区裁剪

select * from 
Dim join Fact
on (Dim.partcol = Fact.partcol)
where Dim.othercol > 10

动态查询的执行计划如下:
Spark-Apache Spark3.0.Dynamic Partition Pruning_第4张图片
从上面可以看出,拥有动态分区裁剪,Spark能够在运行的时候先对Fact表的partcol进行了一次过滤,然后再和Dim表进行Join,可想而知这个性能一般都会有提升的,特别是Fact表有很多无用的数据时性能提升会非常大的


Update
2019-11-05

你可能感兴趣的:(成长,大数据,Spark)