HQL的解析过程主要在Driver中的compile方法,这一些主要看这个方法中的代码。
1. compile中的主要内容
public int compile(String command, boolean resetTaskIds, boolean deferClose) {
..........
// 对sql语句进行处理(敏感信息、变量替换等)
String queryStr = command;
queryStr = HookUtils.redactLogString(conf, command); // 处理敏感信息(这里应该是可以自定义扩展的)
............
// Step1. 获取抽象语法树
ASTNode tree = ParseUtils.parse(command, ctx);
.............
// Step2. 进行语义分析
BaseSemanticAnalyzer sem = SemanticAnalyzerFactory.get(queryState, tree);
sem.analyze(tree, ctx);
sem.validate();
// Step3. 生成执行计划
schema = getSchema(sem, conf);
plan = new QueryPlan(queryStr, sem, perfLogger.getStartTime(PerfLogger.DRIVER_RUN), queryId, queryState.getHiveOperation(), schema);
.............
return 0;
}
compile中主要有三大部分内容: