HQL可以粗略地分为两层:
算子层:操作数(expression)+操作符(Operator: select/join/groupby等)
HIVE前端编译生成逻辑计划(算子树,Operator组成)后,再进行切割, 生成物理执行计划(MapTask/ReduceTask组成);
函数层:操作数(expression) + 操作符(UDF:case when, if, count, sum等)
每个Operator的求值由若干个ExprEvaluator构成,如select a + 2,函数层需要add(column(a),2)
算子树执行的大概示意如下
Operator root.process() {
// 操作数ExprNode求值,例如select a, b, c的a,b,c
// group by a+b, a的a+b,a
// ExprNodeDesc对应的求值器是ExprNodeEvaluator
Foreach(ExprNodeEvaluator eval : evals) {
operand[i] = eval.evaluate();
}
// 如果Evaluator是FuncEvaluator,则会再调用UDF来求值
ForEach(Operator child: children) {
child.process(operand);
}
}
(Expression使用ExprNodeDesc来序列化描述),主要包括: