这篇主要介绍hive词法、语法解析的源码 以及hive AstTree

1、Hive的语法文件

对一个已有的项目进行语法分析,首先是要找到语法分析文件,分析语法文件之间的关系,然后根据语法分析文件提供的接口,确定语法解析在这个体系中所处的位置。

语法文件是以.g结尾

hive源代码版本 hive源码解析_大数据

基本可以确定了 ql下面就是需要找到东西

  • HiveLexer.g 是做词法分析的,定义了所有用到的token
  • HiveParser.g 是做语法解析的
  • FromClauseParser.g  from从句语法解析
  • SelectClauseParser.g  select 从句语法解析
  • IdentifiersParser.g  自定义函数的解析

2、Hive的语法文件间的关系

hive源代码版本 hive源码解析_hadoop_02

HiveParser.g 有一行import SelectClauseParser,FromClauseParser, IdentifiersParser

hive源代码版本 hive源码解析_大数据_03

SelectClauseParser, FromClauseParser,IdentifiersParser 包含在HiveParser.g中antlr v3.1开始,允许在逻辑上把一个大语法划分成几大块,独立实现,然后合并在一起,是为了解决把所有语法塞入到一个文件里导致编译出来的java文件过大和逻辑多了之后不容易阅读的问题。

3、运行Hive的语法文件

用antlrworks打开HiveParser.g文件,如果下图:

hive源代码版本 hive源码解析_hive源代码版本_04

点击小甲虫,如果下图,输入一条sql语句:

hive源代码版本 hive源码解析_数据仓库_05

生成的抽象语法树:

hive源代码版本 hive源码解析_hadoop_06

4、Hive中获取ASTTree

Driver.java

hive源代码版本 hive源码解析_数据仓库_07

ParseDriver.parse()方法 获取asttree,写测试类来观察具体获取的asttree:

hive源代码版本 hive源码解析_hadoop_08

输出astree:

hive源代码版本 hive源码解析_hive_09