HiveQL解析流程:

  1. Hive根据Antlr定义的词法、语法规则完成词法、语法分析将HQL解析为AST Tree;
  2. 遍历AST Tree,抽象出查询的基本组成单元Query Block;
  3. 遍历Query Block解析为操作树Operator Tree(即,逻辑执行计划);
  4. 逻辑优化器进行操作树变换,合并多余的ReduceSinkOperator,减少shuffle;
  5. 遍历Operator Tree,将操作树翻译为对应的MapReduce任务;
  6. 物理优化器进行MapReduce任务变换,生成最终的执行计划。

1、前言

​ Hive通过antlr3定义HiveQL语言。ANTLR是一个基于LL(*)算法实现的语言识别器,定义词法文件、语法文件,通过 antlr 可以构造出相应的词法分析器 (Lexer)、语法分析器 (Parser) 和树分析器 (Tree Parser)。

词法分析器(Lexer):校验输入字符的合法性,将无含义的字符流翻译为有意义的单词(token),识别关键字,生成token流。

语法分析器(Parser):语法分析器将获取到的token流组织,按照语法规则进行重写生成抽象语法树。

树分析器(TreeParser):对语法分析生成的抽象语法树遍历,进行语法树的分析工作。

2、词法、语法文件

​ Hive中通过antlr3定义的词法文件、语法文件存放在Hive源码src/org/apache/hadoop/hive/ql/parse/ 目录中,以.g后缀结尾,其中包含了5个文件。

HiveLexer.g :定义Hive关键字,及组成词组的合法字符

SelectClauseParser.g :定义select语句的语法规则

FromClauseParser.g :定义from语句的语法规则

IdentifiersParser.g :定义函数、group等的语法规则

HiveParser.g:定义语法规则文件,引入了其他语法规则文件

词法文件

​ HiveLexer.g是Hive的词法文件,其中定义了Hive所有的关键字、保留字以及可以被Hive识别的合法字符,不在其中定义的字符,将被Hive认为是非法字符输入。词法规则示例:

KW_SELECT : 'SELECT';
KW_WHERE : 'WHERE';
KW_FROM : 'FROM';
fragment
Letter: 'a'..'z' | 'A'..'Z';

语法文件

​ 语法文件中定义了HiveQL的语法规则,用户写的HiveQL将会按照在语法文件中定义的语法规则进行重写,将HiveQL转换为抽象语法树。

​ Hive的查询语句由以下几个部分构成:

  • Select语句:查询映射部分;
  • From语句:描述查询的数据源,数据源主要包括表、子查询语句、join语句等;
  • Body语句:查询语句的主体部分,包括group by,distribute by,order by,sort by,limit,having,where,clusterby等。

​ 语法文件中 atomSelectStatement 部分是查询语句的基本结构,如下:

atomSelectStatement:s=selectClausef=fromClause?w=whereClause?g=groupByClause?h=havingClause?win=window_clause?-> ^(TOK_QUERY $f? ^(TOK_INSERT ^(TOK_DESTINATION ^(TOK_DIR TOK_TMP_FILE))$s $w? $g? $h? $win?))|LPAREN! selectStatement RPAREN!;

​ 语法文件中,将输入的HiveQL按照语法规则进行重写,生成如下结构语法树:

​ 语法树由from 和 TOK_INSERT 两部分组成。from 代表了 from子句的语法树;TOK_INSERT 子树是查询的主体部分,包含了查询结果目的数据源TOK_DESTINATION子树、select子句语法树、body子句(where, group,having等)语法树。

​ 以上是Hive查询语句的语法树主体结构,所有的查询语句都会转换成这样结构的语法树,不同的是from、select等子树的不同,子树的生成同样也是根据语法文件中定义的语法规则,对各个子句进行重写,生成对应的语法树子树,拼接到语法树的主体结构上,最终生成HiveQL对应的完整抽象语法树。

3、 词法、语法解析

词法、语法解析入口

Driver类
run(cmd)
-runInternal(cmd,compiled)
--compileInternal(cmd)
---compile(cmd)* 开始进行词法、语法解析
ParseUtiles工具类
----parse(cmd)ParseDriver解析驱动类
-----parse(cmd)
------1.HiveLexerX 词法解析
------2.HiveParser 语法解析
------3.parser.statement().getTree() 生成AST Tree

解析流程

​ HiveLexerX,HiveParser都是由Antlr词法、语法文件编译后自动生成的词法、语法解析类。

  • HiveLexerX解析类进行字符流->Token流的转换,其进行HQL词法识别;
  • HiveParser解析类进行字符流->Token流的转换,其进行HQL语法识别,语法识别会对原语进行翻译,并通过一些标识符标示一些特定的语法(如,TOK_QUERY标示一个查询块);

示例HiveQL:

SELECT t1.id,t1.name,t2.name AS name_t2
FROM temp.t1 t1
JOIN temp.t2 t2 ON (t1.id=t2.id and t2.name='aa')
WHERE t1.name='a'
;

基于示例HQL,生成的AST Tree如下:

TOK_QUERYTOK_FROMTOK_LEFTOUTERJOINTOK_TABREFTOK_TABNAMEtempt1t1TOK_TABREFTOK_TABNAMEtempt2t2and=.TOK_TABLE_OR_COLt1id.TOK_TABLE_OR_COLt2id=.TOK_TABLE_OR_COLt2name'aa'TOK_INSERTTOK_DESTINATIONTOK_DIRTOK_TMP_FILETOK_SELECTTOK_SELEXPR.TOK_TABLE_OR_COLt1idTOK_SELEXPR.TOK_TABLE_OR_COLt1nameTOK_SELEXPR.TOK_TABLE_OR_COLt2namename_t2TOK_WHERE=.TOK_TABLE_OR_COLt1name'a'

​ 详细对比HQL原语和AST Tree来看,解析过程对每个表生成一个TOK_TABREF节点,对from关键字生成一个TOK_FROM节点,对查询的每个字段生成一个TOK_SELEXPR节点,每个使用到的属性列生成一个TOK_TABLE_OR_COL节点,where关键字对应生成TOK_WHERE节点,其他节点类似可以一一对应到HQL原语上。

hive查询where join_Hive解析流程-抽象语法树生成相关推荐

  1. hive遍历_Hive解析流程-抽象语法树生成

    HiveQL解析流程: Hive根据Antlr定义的词法.语法规则完成词法.语法分析将HQL解析为AST Tree: 遍历AST Tree,抽象出查询的基本组成单元Query Block: 遍历Que ...

  2. Java解析SQL生成语法树_04. Hive源码 — HQL解析(抽象语法树的生成和语义分析)

    HQL的解析过程主要在Driver中的compile方法,这一些主要看这个方法中的代码. 1. compile中的主要内容 public int compile(String command, boo ...

  3. AST(抽象语法树)超详细

    自己研究的东西会用到AST,就自己通过查阅资料,整理一下. 本文目录 第一部分:AST的作用 第二部分:AST的流程 第三部分: Eclipse AST的获取与访问 第一部分:AST的作用 首先来一个 ...

  4. AST抽象语法树的基本思想

    AST抽象语法树的基本思想 前言 AST概述 AST结构 AST解析 转换 生成 前言 在阅读java ORM框架spring data jpa的源码时,发现Hibernate(spring data ...

  5. 抽象语法树在 JavaScript 中的应用

    抽象语法树是什么 在计算机科学中,抽象语法树(abstract syntax tree 或者缩写为 AST),或者语法树(syntax tree),是源代码的抽象语法结构的树状表现形式,这里特指编程语 ...

  6. php ast 抽象语法树,AST抽象语法树的基本思想

    AST抽象语法树的基本思想 前言 AST概述 AST结构 AST解析 转换 生成 前言 在阅读java ORM框架spring data jpa的源码时,发现Hibernate(spring data ...

  7. ast抽象语法树_新抽象语法树(AST)给 PHP7 带来的变化

    本文大部分内容参照 AST 的 RFC 文档而成:https://wiki.php.net/rfc/abstract_syntax_tree,为了易于理解从源文档中节选部分进行介绍. 我的官方群点击此 ...

  8. java抽象语法树_抽象语法树AST的全面解析(一)

    Javac编译概述 将.java源文件编译成.class文件,这一步大致可以分为3个过程: 1.把所有的源文件解析成语法树,输入到编译器的符号表: 2.注解处理器的注解处理过程: 3.分析语法树并生成 ...

  9. 抽象语法树的简单原理

    抽象语法树(Abstract Syntax Tree,AST),或简称语法树(Syntax tree),是源代码语法结构的一种抽象表示.它以树状的形式表现编程语言的语法结构,树上的每个节点都表示源代码 ...

最新文章

  1. 反应式系统实现MQTT客户机
  2. 服务器证书安装配置指南(Nginx)-天威诚信
  3. git rollback代码都没了_Git使用总结
  4. 添加用户信息的方法java_添加用户的流程分析
  5. python打包成exe 可执行文件 。教程
  6. for遍历list scala_面试官问:List 如何一边遍历,一边删除?
  7. Python之socketserver模块和验证客户端链接的合法性
  8. NAACL’21 | 来看如何让模型学会因为所以但是如果
  9. FI常用T-CODE
  10. 部分网卡安装esxi6.7报错“Shutting down firmware services…解决方法
  11. 6间房,把评论添加到视频的metadata.
  12. VBNET的一些特殊能力
  13. Struts2 中的值栈的理解
  14. 使用AdapterTypeRender对不同类型的item数据到UI的渲染
  15. 怎么把python程序安装到别人电脑上_如何在自己的电脑上安装python的idle版 - 卡饭网...
  16. uniapp使用iconfont图标
  17. CSS中animation动画-详解
  18. 什么蓝牙耳机颜值高?盘点四款高颜值蓝牙耳机
  19. 在win10中安装并配置多个JDK不同的版本
  20. 需求分析——软件需求规格说明书标准目录

热门文章

  1. Appium+python自动化(十六)- ADB命令,知否知否,应是必知必会(超详解)
  2. 基于OneAPM的Web系统性能监测
  3. html-webpack-plugin 中使用 title选项设置模版中的值无效
  4. 解决mysql从windows迁移到centos出现乱码问题
  5. [HDU] 3491 Thieves
  6. 数学趣题——渔夫抓鱼问题
  7. 购买女装摩托车(踏板车)
  8. php算法两数之和 复杂度,每天一道leetcode算法题:两数之和-php版
  9. 初学者phthon笔记(异常处理)
  10. 微课|玩转Python轻松过二级(1.1节):Python命令式编程与函数式编程模式