来更新一下我的叨叨叨。

在Driver.java文件中有这么一段程序

hivesql语法解析器 hive语法树_数组

用方框圈住的地方,是sql 开始转化为抽象语法树的位置,但此时生成的生成的抽象语法树是不能被直接处理的,因为现在生成的抽象语法树是Nil开头的语法树。所以就会有第二步的操作,获得TOK_QUERY开头的ASTNode。(根据我观察到的语法树,TOK_QUERY子节点分为TOK_FROM和TOK_INSERT,在这里我有一个小小的猜测,TOK_FROM对应了map阶段,而TOK_INSERT对应了reduce阶段。仅仅是猜测,博客也是根据源码读到哪,写到哪)

在翻译成ASTNode后需要找到合适的语义分析器,在源码中发现是通过工程模式,

hivesql语法解析器 hive语法树_hivesql语法解析器_02


通过get方法内通过判断第一个ASTNode的TOKEN_NAME(每一个ASTNode都有一个用来存储子节点的ArrayList属性),获取不同的语义分析器。普通的查询语句由SemanticAnalyzer负责。对ASTNode所有的解析是通过下图的方法展开的。

hivesql语法解析器 hive语法树_子节点_03

先说第一个方法genResolvedParseTree(…)

hivesql语法解析器 hive语法树_语法树_04


通过这个方法可以将ASTNode转变为QueryBlock。这个方法中最为核心的就是

hivesql语法解析器 hive语法树_hivesql语法解析器_05

dophase1会将ASTNode中的内容解析到QueryBlock中。

在QueryBlock中有两个属性是 QBParseInfo、QBMetaData。QBParseInfo会直接存储group by 、sort by、where 等信息。sql语句中的源表目标表信息会经过元数据库的检查,存储到QBMetaData中。

hive 将ASTNode node解析为QueryBlock的方式是遍历每一个node节点,如果node节点下面还有子node,先遍历完全部的子节点后,在遍历同级别的node。ASTNode是存储在ArrayList里面,因为ArrayList是一个数组,数组的优势之一就是查找 ,ASTNode一旦生成,不会改动,只是频繁的查找,每一个node中会记录自己的父节点和子节点。

因为篇幅的关系,无法把所有的处理方法都记录在这里,以processJoin简单说明。

hivesql语法解析器 hive语法树_子节点_06


hivesql语法解析器 hive语法树_子节点_07