Hive生成逻辑算之后,会对逻辑算子进行优化。优化的目的是为了减少不必要的数据处理、消除冗余运算,以到达提高执行效率的目的,这个过程称为逻辑优化。
4.1 逻辑优化类型
Hive逻辑优化包括以下几点:
1) 谓词下推
谓词下推指的是将外层HiveQL的过滤表达式提前到内层HiveQL,以达到提前过滤,减少数据的处理量。如语句:selecta.* , b.* from a join b on a.id=b.id where a.num>10 and b.num>20过滤条件a.num>10 和b.num>20可以提前到join操作之前进行,提前对a,b进行过滤,这样可以减少join时表的大小。
2) 常量折叠
常量折叠包含三个内容:
(1)折叠表达式。如果表达式全是常量,计算出来该表达式的值并替代原表达式。
(2)逻辑短路。如果布尔表达式包含常量并且可根据常量进行短路操作,则进行短路运算。如2>1and a.id>b.id可直接计算出结果为true.
(3) 表达式常量传递。如a=1 ,b=a,常量1可以传递给b.
3)合并RS算子
将算子DAG中同一条路径上的符合特定条件的两个RS算子合并成一个RS算子,这样可以减少shuffle过程,提高执行速度。这两个RS算子位于路径前面的为parent RS(简称pRS),位于路径后面的为childRS(简称cRS)。合并后cRS算子将会被删除,只剩下pRS算子。pRS和cRS能合并必须同时满足以下条件:
(1) sort key满足包含关系。如pRS sort key为(k1),cRS的sort key为(k1,k2),两组sortkey满足包含关系,可以合并。由于按照(k1,k2)有序则一定满足按照(k1)有序,因此合并后pRS的sortkey为(k1,k2),cRS将被删除。
(2) partitionkey满足包含关系。如pRS partition key为(k1