CombineFilters优化器还可以再做一些改进呀
spark sql谓词下推逻辑优化器PushDownPredicates包含了三个规则:
CombineFilters是合并Filter节点的优化器,即处理Filter+Filter的情况
CombineFilters与PushPredicateThroughJoin、PushPredicateThroughNonJoin
搭配使用
代码
代码比较简单:如果是Filter+Filter的情况,判断是否可以合并Filter节点,如果可以的话,给合并
案例
select a,b from (select a,b from testdata2 where b>1) tmp
where tmp.a>3
这个sql产生的逻辑执行计划的两个filter节点本来是分开的
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!
我是小萝卜算子
欢迎关注公众号
每天学习一点点
知识增加一点点
思考深入一点点
在成为最厉害最厉害最厉害的道路上
很高兴认识你