Hive谓词下推--源码中官方解释
package org.apache.hadoop.hive.ql.ppd;//在这个包中PredicatePushDown类中有介绍,翻译不足,请见谅!
public class PredicatePushDown implements Transform {
}
Hive谓词下推(Predicate pushdown):
Hive谓词下推这个词是从关系型数据库借鉴来的,即使对Hive对来说相当于谓词上推。
谓词下推的基本思想:尽可能早的处理表达式(expressions),默认产生的执行计划在看到数据的地方添加过滤器filter,
但是有些情况过滤filter表达式expressions被推到离第一次看到数据的操作operator更近。如,select a.*, b.* from a join b on
* (a.col1 = b.col1) where a.col1 > 20 and b.col2 > 40
对于以上的查询,谓词(a.col1 > 20) and (b.col2 > 40)没有进行谓词下推。而是在join操作之后而被评估。建议两个filter谓词从a表和b表过滤掉join不必要处理的记录数。谓词下推应该在join之前处理这两个谓词。
谓词下推可通过设置参数hive.optimize.ppd=true来打开。
下面讲述一个更抽象的算法:
一个操作在它的子操作已经被处理后再处理。这个操作operator处理它自己的谓词,然后合并它的子操作处理的谓词。在一个操作operator有多个子操作的情况下。将被拆分为OR进行合并。
一个操作的谓词表达式使用如下步骤进行处理:
如果表达式是一个常量,将会走谓词下推
如果表达式是一个列引用,将会走谓词下推,它的别名被标记。
如果表达式是一个索引,并数组及索引表达式被看作子操作children。
如果所有children都走谓词下推,然所有的表达式仅从RowResolver操作引用一个别名。然后当前表达式也会走谓词下推。注意,通过有些操作如Select, ReduceSink, GroupBy, Join等等来改变列作为数据流。这些情况下列引用会被输入流数据相应的表达替代。