hive解析树

本文介绍HiveQL的解析过程,并通过ANTLR生成的语法树(AST)展示了一个查询示例。深入探讨了如何自定义遍历器来获取表名和列名,以及这些信息如何用于后续的数据处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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节点获取相应的值。


hiveQL编译过程参考:


Hive 是基于 Hadoop 的数据仓库工具,它将 SQL 语句转换为 MapReduce、Tez 或 Spark 任务来执行。解析 SQL 是 Hive 执行 SQL 的第一步,是整个执行流程的基础。下面详细介绍 Hive 解析 SQL 的过程。 --- ## Hive SQL 解析流程详解 ### 1. SQL 输入 用户输入一条 HiveQL 语句,例如: ```sql SELECT name, COUNT(*) AS cnt FROM employees GROUP BY name; ``` --- ### 2. 词法分析(Lexical Analysis) Hive 使用 **ANTLR(Another Tool for Language Recognition)** 来进行 SQL 的解析。 - **ANTLR** 是一个强大的解析器生成器,Hive 使用它定义 SQL 的文法规则。 - 词法分析器(Lexer)将输入的 SQL 字符串拆分为一个个 **token**(词法单元),如 `SELECT`, `FROM`, `GROUP`, `BY` 等。 - 每个 token 都有对应的类型和值。 例如: ``` SELECT -> TOK_SELECT name -> TOK_IDENTIFIER COUNT -> TOK_FUNCTION * -> TOK_ALLCOLS FROM -> TOK_FROM ... ``` --- ### 3. 语法分析(Syntax Analysis) 语法分析器(Parser)根据 HiveQL 的语法规则,将 token 流构建成一棵 **抽象语法树(AST, Abstract Syntax Tree)**。 - AST 是一棵树形结构,每个节点代 SQL 的一部分语法结构。 - Hive 使用 ANTLR 生成的解析器来完成这一步。 例如上面的 SQL 会被解析为如下结构(简化): ``` TOK_QUERY TOK_SELECT TOK_SELEXPR TOK_TABLE_OR_COL name TOK_SELEXPR TOK_FUNCTION COUNT TOK_ALLCOLS TOK_FROM TOK_TABREF TOK_TABNAME employees TOK_GROUPBY TOK_TABLE_OR_COL name ``` --- ### 4. 语义分析(Semantic Analysis) 语义分析阶段将 AST 转换为 **Query Block(QB)**,并进行一系列语义检查,包括: - 是否存在 - 字段是否存在 - 类型检查 - 别解析 - 子查询处理 - 视图展开 - 分区裁剪(Partition Pruning) - 列裁剪(Column Pruning) 最终生成一个 **Operator Tree(操作符树)**,该树描述了执行 SQL 所需的操作步骤,如: - `TableScanOperator`:扫描 - `SelectOperator`:字段选择 - `GroupByOperator`:分组聚合 - `ReduceSinkOperator`:用于 MapReduce 的 shuffle 阶段 - `FileSinkOperator`:写入结果 --- ### 5. 逻辑计划优化(Logical Optimization) Hive 对 Operator Tree 进行优化,例如: - 谓词下推(Predicate Pushdown) - 投影剪裁(Projection Pruning) - 共享子查询优化 - 谓词重写 - 聚合函数优化 --- ### 6. 物理计划生成(Physical Plan Generation) 将优化后的 Operator Tree 转换为具体的 **物理执行计划(DAG)**,也就是 MapReduce、Tez 或 Spark 的任务。 - 每个 Operator 被映射为一个 Map 或 Reduce 任务。 - 生成 Job 的执行顺序和依赖关系。 --- ### 7. 执行引擎执行 最后,物理计划被提交到执行引擎(如 MapReduce、Tez、Spark)执行,完成 SQL 查询。 --- ## 示例:Hive SQL 解析流程总结 | 阶段 | 内容 | |------|------| | 输入 | SQL 字符串 | | Lexical Analysis | 分词为 Token | | Syntax Analysis | 构建 AST | | Semantic Analysis | 生成 Operator Tree | | Logical Optimization | 优化 Operator Tree | | Physical Plan Generation | 生成执行计划(MapReduce/Tez/Spark) | | Execution | 提交执行任务,返回结果 | --- ## 相关代码:ANTLR 示例(简化) Hive 使用 ANTLR 定义 SQL 的语法文件,如下是简化版的 HiveQL 语法片段(`.g` 文件): ```antlr query : SELECT select_list FROM table_name ; select_list : ( column ( ',' column )* ) ; column : ID ; table_name : ID ; ID : [a-zA-Z_][a-zA-Z0-9_]* ; WS : [ \t\r\n]+ -> skip ; ``` --- ##
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值