CombineFilters优化器还可以再做一些改进呀
spark sql谓词下推逻辑优化器PushDownPredicates包含了三个规则:
CombineFilters是合并Filter节点的优化器,即处理Filter+Filter的情况
CombineFilters与PushPredicateThroughJoin、PushPredicateThroughNonJoin
搭配使用
代码
代码比较简单:如果是Filter+Filter的情况,判断是否可以合并Filter节点,如果可以的话,可以合并成为一个Filter节点
案例
select a,b from (select a,b from testdata2 where b>1) tmp
where tmp.a>3
Analyzed logical plan:
这个sql产生的逻辑执行计划的两个filter节点本来是分开的
Optimized logical plan:
PushPredicateThroughJoin和CombineFilters两个优化器配合,完成下推合并操作
思考
CombineFilters只有在Filter中的condition都是确定性的时候才能合并:
case Filter(fc,nf@Filter(nc,grandChild))if fc.deterministic && nc.deterministic
下面这个sql,rand()<0.1 不满足确定性的条件,combineFilters 没有给做合并,但实际上a>3是可以提前做过滤的
select a,b from (select a,b from testdata2 where b>1) tmp
where tmp.a>3 and rand()<0.1
改造代码
改造后的效果
改造后a>3合并成功
Hey!
我是小萝卜算子
每天学习一点点
知识增加一点点
思考深入一点点
在成为最厉害最厉害最厉害的道路上
很高兴认识你
推荐阅读:
从一个sql引发的hive谓词下推的全面复盘及源码分析(上)
从一个sql引发的hive谓词下推的全面复盘及源码分析(下)
Spark sql逻辑执行计划优化器——EliminateOuterJoin【消除outerjoin】
spark sql非join情况的谓词下推优化器PushPredicateThroughNonJoin
Spark sql Expression的deterministic属性