山大软工实践hive(7)-查看各优化器内容

2021SC@SDUSC

山大软工实践hive(7)-查看各优化器内容

文章目录

1

这一次来看看优化器的源码,先看PointLookupOptimizer
山大软工实践hive(7)-查看各优化器内容
翻译意思是此优化将采用一个筛选器表达式,如果其谓词包含其子级为常量相等表达式的OR运算符,它将尝试生成IN子句(这更有效)。如果OR运算符包含AND运算符子级,则优化可能会生成一个使用结构的IN子句。
首先老版hive是不支持in字句的,然后这里是对常量等值表达式的or字句转化为in字句
struct是hive的一种复杂数据类型,可以包含不同数据类型的元素。这里的structs应该指的是它
山大软工实践hive(7)-查看各优化器内容
这个解释中的“点语法”让我产生联想,毕竟优化器名字是PointLookUp

暂时没头绪,先看它的transform方法
山大软工实践hive(7)-查看各优化器内容
Rule
山大软工实践hive(7)-查看各优化器内容
看意思是用于限定dispatcher向进程分发operator的规则,可以通过计算开销之类的,具体什么用不清楚

NodeProcessor
山大软工实践hive(7)-查看各优化器内容
处理op的基类,实现没有特殊需求的op的通用处理流程,也不知道具体干啥,继续向下看

opRules.put的第一个参数,跳转过去
山大软工实践hive(7)-查看各优化器内容
RuleRegExp类,说是处理各表达式的
看这个被调用的类,和正则表达式有关,它举的例子是TS.*RS,意思是TS后面跟着任意算子,最后跟一个RS(比如可以是TS FIL RS,可以是TS FIL LIM RS)

FilterOperator.getOperatorName(),连起来就是FIL%
山大软工实践hive(7)-查看各优化器内容
再看正则表达式那边,第一个if语句里的方法,它的作用是看wildcards里有没有这个regExp,有返回true,无返回false
山大软工实践hive(7)-查看各优化器内容
山大软工实践hive(7)-查看各优化器内容
山大软工实践hive(7)-查看各优化器内容
很明显没有%,应该返回false。所以会执行 this.patternWithoutWildCardChar = regExp;就说没有这个,所以这%目前加的莫名其妙。接着往下看
山大软工实践hive(7)-查看各优化器内容
这个方法只做初始化

再看GraphWalker,第一印象感觉是用于游走DAG的,很明显是个接口
山大软工实践hive(7)-查看各优化器内容
看到有多个startnode,和DAG相符

再看这里的FowardWalker
山大软工实践hive(7)-查看各优化器内容
方法指向父类DefaultGraphWalker
山大软工实践hive(7)-查看各优化器内容
类的注释说用户注册规则,然后最相符的进程的最接近的rule被激活。这里的概念很模糊(看不懂)

2

暂时没头绪,看另外一个ConstantPropagate(跳过了一个,那个实现的功能也看不懂,这个的好歹有对应)
山大软工实践hive(7)-查看各优化器内容
这个意外地眼熟,对应的是常量折叠3种的逻辑优化(在第5篇提到),能看出它的优化形式是从根节点遍历DAG,看看它的transform方法
山大软工实践hive(7)-查看各优化器内容
结构和PointLookUp的transform差不多(看了一下其他优化器也一样),也就是说结构大体是 创建opRules的Map->向其中放入算子,,,嗯,既然暂时不知道opRules干了啥,应该接着向下看才对,所以先返回 PointLookupOptimizer

3

山大软工实践hive(7)-查看各优化器内容
回头看transform方法最后一段,接下来是建立一个Node的数组,添加pctx中的所有头结点,然后再用graphwalker开始walk
先看Node干什么用的
山大软工实践hive(7)-查看各优化器内容
此接口定义了Walker和dispatchers所需的功能。由需要遍历的图的节点实现。
总之和图的遍历有关,接口的两个方法分别用于图遍历和分发器,getChildren就获得子节点,GetName得到的应该是“R1”这样的字符(猜测),然后突然意识到Operator
山大软工实践hive(7)-查看各优化器内容
继承了Node,之前没看到,也就是说,DAG的节点的最抽象的描述就是Node

另外,pctx是ParseContext类的
山大软工实践hive(7)-查看各优化器内容
看意思是和解析上下文与操作符树(DAG)有关,说parse context 包含DAG,所以可以认为成员变量包含DAG的节点记录
山大软工实践hive(7)-查看各优化器内容
然后通过pctx调用的方法,找到返回的值(图中蓝色标记部分),记录了所有以TS节点开头的头结点!
除此之外,它还记录了一些特别的算子如SMBjoin,join,RS,可能是为了方便相关的优化?

所以最后一段代码的意思很明确了,就是获取所有DAG的头节点后启动walk,现在去看starkwalking方法,这是下一步的目的

可能的接下来

starkwalking方法
Rule,NodeProcessor干了啥
整理这个transform方法每一步做了什么,达到什么效果
知道这个优化器什么效果
横向查看其它优化器

上一篇:线性判别器(LDA)


下一篇:Linux动态库生成以及调用