hive解析树

Hive的ParseDriver类中,通过antlr生成的语法树AST。
例子:Select name,ip from zpc where age > 10 and area in (select area from city)


(TOK_QUERY 
(TOK_FROM 
(TOK_TABREF 
(TOK_TABNAME zpc)
)
(TOK_INSERT 
(TOK_DESTINATION (TOK_DIR TOK_TMP_FILE)) 
(TOK_SELECT 
(TOK_SELEXPR (TOK_TABLE_OR_COL name)) (TOK_SELEXPR (TOK_TABLE_OR_COL ip))
(TOK_WHERE 
(and 
(> (TOK_TABLE_OR_COL age) 10) 
(TOK_SUBQUERY_EXPR (TOK_SUBQUERY_OP in) 
(TOK_QUERY 
(TOK_FROM 
(TOK_TABREF 
(TOK_TABNAME city)
)
(TOK_INSERT 
(TOK_DESTINATION (TOK_DIR TOK_TMP_FILE)) 
(TOK_SELECT 
(TOK_SELEXPR (TOK_TABLE_OR_COL area))
)
)
(TOK_TABLE_OR_COL area)
)
)
)
)
)


注:1.TOK_INSERT个节点是在语法改写中特意 增加了的一个节点。原因是Hive中所有查询的数据均会保存在HDFS临时的文件中,无论是中间的子查询还是查询最终的结果,Insert语句最终会将数 据写入表所在的HDFS目录下。
2. 每个表生成一个TOK_TABREF节点。

目标:可以遍历AST,获取到table和table对应的列名。
另外可以从mysql中获取table的列及类型对应信息。(调用desc table即可)。

调用hive树的遍历:((SemanticAnalyzer) sem).doPhase1(ast, qb, null);
QBParseInfo info = qb.getParseInfo();
QBParseInfo中可以获取表名,分区名,列名,别名等信息。
判断QB的属性和方法后,觉得QB中的信息并不是想要的信息。

结论:自定义遍历器,来遍历AST树中的表名。遍历器的实现其实也很简单,深度遍历,判断对应的token节点获取相应的值。

http://www.cnblogs.com/drawwindows/p/4595771.html

hiveQL编译过程参考:


你可能感兴趣的:(大数据)