2021SC@SDUSC
山大软工实践hive(11)-ConstantPropagate优化器的流程
目的
看懂如何执行对应的优化
过程
看ConstantPropagate类,对应常量折叠,百度翻译它的功能(后面解析要用)
其中udf为hive用户自定义函数
transform方法,一开始
pactx为传入的参数
然后放了8个规则
接下来
ConstantPropagateWalker是该优化器的内部类
总结一下,就是一个节点的所有父节点要先于该节点被dispatch
但是ForwardWalker的walk也是让父节点先被dispatch,这两个有什么区别?看了半天没感觉有什么区别
然后就是dispatch,从8个规则中找到minCost,然后获取对应的NodeProcessor,进行process方法。注意,当rule为null时,会用defaultprocess,之前看的优化器的这个为null,但这个优化器是传了一个ConstantPropagatepProcFAactory.getDefaultProc()
(下图第一,三个参数在上一个优化器传的null)
.
然后就是就选中的规则process,先去看优化where语句的 ConstantPropagateProcFactory.getFilterProc()的process方法
这个类的注释大概就是说用于处理Filter算子里的常量表达式,其他的规则估计也是类似:处理对应算子的场两个表达式
看看它的process方法的前面一部分,看荧光标记的那一行
注释第一句是从父节点们获得传播常量,这应该对应该优化器的第三种功能。
其它部分注释的翻译:
总之就是确认 列=常量 的表达式并添加到map返回。这个行解析器是什么?
方法主体就不看了,人看麻
然后process方法里下一句就是把这个算子的常量内容存在pctx里
下一部分
首先是获得op原本的predicate,根据上个优化器的内容,如果修改会把predicate设置为新的,反之就用原本的。
看划黄线的部分,常量折叠
传入参数分别是,旧predicate,clomuns=常量的map,pctx,算子本身,tag=0,传播=true
进行的是折叠输入的表达式。
其中有一部判断一个选项是SUORTCUT还是FULL
如果是shortCut,就只会执行第二个功能:逻辑表达式的优化,去除不必要的or操作
反之则执行所有的三种优化(注释还举了点例子)
它们返回的是对旧predicate处理后的结果,之后就是看这个newCondn是否可以被保存,最后让op记录这个newCondn,这一方面也和上个优化器相似
值得一提的是,它会把满足特定条件的op添加到opToDelete,这在transform的后面部分有用
剩下的就和上个优化器一样
接着看主方法的剩下部分
看意思是它会把optoDelete里除了只有一个父节点的节点删除,并且把他们的子节点给其它节点“收养”
最后
不要试图看懂如何执行对应的优化