在Optimizer中定义了一个逻辑计划优化规则集,这些集合被分成了几类,其中一类就是操作下推(Operator push down)。
操作下推的意思是:把一些操作(比如:filter等)尽量推到接近数据源的位置去计算,这样可以让数据尽早的得到处理,从而可以减少数据的传输,提升处理效率。
本文主要对这些逻辑计划优化规则进行介绍,后面的文章会对这些规则进行详细分析。
操作下推逻辑计划优化规则
在spark-2.4.4中定义了以下几种操作下推的优化规则:
-
PushProjectionThroughUnion:union的过滤或select操作下推;
-
ReorderJoin:join过滤操作下推;
-
EliminateOuterJoin:消除outer join操作;
-
PushPredicateThroughJoin:join相关过滤操作下推;
-
PushDownPredicate:谓词操作下推;
-
LimitPushDown:limit操作下推;
-
ColumnPruning:列剪裁;
-
InferFiltersFromConstraints:对join的过滤操作进行优化。
操作下推的优化规则介绍
下面介绍这几种下推操作的功能。
PushProjectionThroughUnion
该下推操作的作用是:把在Union操作一边的Filters或Projections操作推到Union的两边。要注意这样优化的前提是在Spark SQL中Union操作不会对数据去重。
也就是说,当进行union操作时,同时进行了select操作,Spark SQL会把select操作推到参与union操作的两端的数据集中。
ReorderJoin
对Join操作进行重新排列,把所有的过滤条件推入join中,以便保证join内部至少有一个过滤条件。
EliminateOuterJoin
尽可能的消除outer join。在条件允许的情况下对outer join进行优化,尽可能消除和优化outer join,尽量使用其他join类型来代替,比如:inner join。
PushPredicateThroughJoin
会尽量把Join的过滤器或过滤条件下推到Join两边的语句中。这个优化规则是根据hive sql的OuterJoinBehavior来进行优化的。
PushDownPredicate
当我们在加载数据集后立即执行where或filter运算符时,Spark SQL 将尝试将 where/filter 谓词下推到数据源。
这种优化称为过滤器下推或谓词下推,目的是为了提高查询的性能,因为过滤是在非常靠近数据源时执行的,而不是在将整个数据集加载到 Spark内存然后处理数据时执行。
PushDownPredicate还应用于在窗口分区上进行投影或过滤后带有过滤器的结构化查询。
LimitPushDown
当join或union操作使用limit操作时,把limit操作推到union和join的儿子节点。
ColumnPruning
去掉没有必要读取的列。比如,有时我们可能会对一张很宽的表的一两个字段进行聚合操作,其他字段其实是没有必要读取的,此时,就可以通过该规则来优化数据读取的逻辑计划。
InferFiltersFromConstraints
根据运算符的现有约束生成附加过滤器列表,删除那些已经是运算符条件的一部分或作为运算符子约束一部分的过滤器。这些过滤操器已经被插入到过滤操作已存在的条件中,或则已插入到Join操作的某一侧。
注意:虽然此优化适用于许多类型的连接,但它主要适用于内部连接和 LeftSemi 连接。
小结
本文对操作下推的各个优化规则进行了介绍,下面的文章会详细简介这些规则的使用和实现原理。