HiveSQL源码之语法词法编译文件解析一文详解

本文涉及的产品
云解析 DNS,旗舰版 1个月
云解析DNS,个人版 1个月
全局流量管理 GTM,标准版 1个月
简介: HiveSQL源码之语法词法编译文件解析一文详解

前言


工欲善其事必先利其器,首先要了解HiveSQL的编译语法的流程,还是需要懂得HiveSQL的执行流程以及编译规则。曾经在Hive数仓搭建的时候写过部分HiveSQL编译原理:

Hive详解以及CentOS下部署Hive和Mysql



d0cf2e82f0ba4704bf73c25d5ebb87a1.png


我们现在主要研究SQL Parser语法解析这块内容。语法解析可以说是研究一门编程语言的基础了,我们编程语言本身就是告诉计算机要帮助我们做什么事。antlr是编译原理领域比较著名的工具了,这次借助研究hivesql的机会,安装使用一下antlr。


一、Hive SQL编译流程


我们可以这么理解HiveSQL执行以及编译的过程,我们人与人之间的交流可以映射到人与计算机的关系之中,我们可以将计算机视为一个不懂我们本身母语以及其他你熟悉的语言,就像一个外国人你们无法交流。但是我们可以通过翻译器,就像百度翻译一样你输入你的语言,这个翻译器将其翻译为外语,再给外国人看,你们就能懂彼此之间的意思了。人与计算机也是一样的,但是中间的翻译器将需要处理纷繁复杂的语法逻辑问题,中文转英文也存在很多逻辑上面的不同之处,这些都是需要翻译器根据语言逻辑来处理的问题。


我们回顾一下Hive SQL编译流程:

f64b7d8aac6a4d1ba75b3046fbe49588.png


Antlr定义SQL的语法规则,完成SQL词法,语法解析,将SQL转化为抽象语法树AST Tree

遍历AST Tree,抽象出查询的基本组成单元QueryBlock

遍历QueryBlock,翻译为执行操作树OperatorTree

逻辑层优化器进行OperatorTree变换,合并不必要的ReduceSinkOperator,减少shuffle数据量

遍历OperatorTree,翻译为MapReduce任务

物理层优化器进行MapReduce任务的变换,生成最终的执行计划

那么这里我们就需要了解一下Antrl到底是何方神器了,可以将我们输入的sql语言转换为可识别的语法树。


二、Antrl


Antlr是一种语言识别的工具,可以用来构造领域语言。


使用antlr需要我们提前定义好识别字符流的词法规则和用于解释Token流的语法分析规则。然后,antlr会根据我们提供的语法文件自动生成相应的词法/语法分析器。hive借助Antlr定义SQL的词法规则和语法规则,完成SQL词法,语法解析,将SQL转化为抽象语法树AST Tree。HiveSql后续的编译过程全都基于AST Tree,所以我们想要完整理解hive sql的编译过程,需要前置了解一下antlr是怎么工作的。


804768317cf04cb7a557bbb1a0d3d104.png

词法分析器(Lexer):功能如其名,解析字符流的逻辑关系将其分割为离散的Token字符组,供给语法分析器使用。

语法分析器(Parser):将上一步得到的Token流转换为语法定义的树结构。

树分析器(TreeParser):将对语法分析生成的抽象语法数进行遍历,分析处理获得基于语句块的内部查询表达式。


6f00fd3f3e154a1f9c174b680f478adc.png


ANTLR将上述结合起来,它允许我们定义识别字符流的词法规则和用于解释Token流的语法分析规则。然后,ANTLR将根据用户提供的语法文件自动生成相应的词法/语法分析器。用户可以利用他们将输入的文本进行编译,并转换成其他形式(如AST—Abstract Syntax Tree,抽象的语法树)。


我们可以使用antlr来进一步理解antlr是如何做到解析过程的。


三、ANTLRWorks


通过ANTLRWorks可以更加直观的理解解析过程,下载:antlrworks-1.5.1.jar


该程序下载完即可使用,AntlWorks是一个用于构建ANTLR v3语法的GUI开发环境。它是一个独立的Java应用程序,只需单击即可开始使用ANTLR。它包含所有必要的JAR,是开始使用ANTLR的最简单方法。1.5.1是最新的稳定版本,包含ANTLR v3.5.2。


be51b9bb67fa4cdbba969bf177dc61a5.png


下载完毕之后:

bbf10fa861e845d49705bcf7658a7e91.png


建立一个新的.g文件:


537f347c53f64ba19ebc10d60f8347ef.png


可输入这段测试代码:


ecbe5a99b5454273a15e289e2031d05a.png


点击Generate生产代码:


c3617c752e1847768ad6dcba31df15b2.png


成功生产之后调试:


b36e49864e46457683b88d2bc3a1028e.png


输入txt选择expr模式,这就是解析sql语法程序运行结果。

根据此原因我们可以去看Hive开源文档中有关sql的语法定义规则:


https://github.com/apache/hive/tree/branch-3.1/ql/src/java/org/apache/hadoop/hive/ql/parse

54af6bf2f2694dfe91f1fa8175ceddd3.png


通过选择branch可以调整Hive版本,里面不难发现存在多个.g文件,这些文件就是HiveSQL编译的语法定义文件,一句SQL将拆分成很多文件去处理。


2cd53906f04e4dfca4229dff03758dbd.png


共有这么几个,其中文件名称很明显对应着各个语法定义规则。


HiveLexer.g:词法解析文件,定义了所有用到的token。

HiveParser.g:语法解析文件,实现了所有的Hive语法解析。

FromClauseParser.g:FROM语句解析。

IdentifiersParser.g:自定义函数解析,标识符定义 函数名称、系统函数、关键字等。

nonReserved,非保留的关键字可以作为标识符的。比如 select a as date from mytable 这个date不添加转义会报错的,但是该处如果添加 “ | KW_DATE ” date可直接作为标识符使用。

SelectClauseParser.g:select语句解析。

HintParser.g:hive的hint语法解析。

ResourcePlanParser.g:资源操作语法解析。


de79f57e948c4e27b31b267b78e124ca.png


我们可以发现HiveParser.g文件中存在:


59a9fb153e82412892ac7e90e256707c.png


也就是将一句SQL给分割开来分别根据每个SQL语句标识符进行解析,解决把所有语法塞入到一个文件里导致编译出来的java文件过大和逻辑多了之后不容易阅读的问题。而HintParser.g并不包括在HiveParser.g内,是独立存在的一个处理文件。

目录
相关文章
|
26天前
|
XML Java 数据格式
深度解析 Spring 源码:从 BeanDefinition 源码探索 Bean 的本质
深度解析 Spring 源码:从 BeanDefinition 源码探索 Bean 的本质
28 3
|
20天前
|
XML Java 数据格式
java解析xml文件内容
java解析xml文件内容
20 0
|
11天前
|
存储 安全 Java
深度长文解析SpringWebFlux响应式框架15个核心组件源码
以上是Spring WebFlux 框架核心组件的全部介绍了,希望可以帮助你全面深入的理解 WebFlux的原理,关注【威哥爱编程】,主页里可查看V哥每天更新的原创技术内容,让我们一起成长。
|
12天前
|
关系型数据库 分布式数据库 数据库
PolarDB-X源码解析:揭秘分布式事务处理
【7月更文挑战第3天】**PolarDB-X源码解析:揭秘分布式事务处理** PolarDB-X,应对大规模分布式事务挑战,基于2PC协议确保ACID特性。通过预提交和提交阶段保证原子性与一致性,使用一致性快照隔离和乐观锁减少冲突,结合故障恢复机制确保高可用。源码中的事务管理逻辑展现了优化的分布式事务处理流程,为开发者提供了洞察分布式数据库核心技术的窗口。随着开源社区的发展,更多创新实践将促进数据库技术进步。
18 3
|
11天前
|
文字识别 Java Python
文本,文识08图片保存()上,最方便在于整体生成代码,serivce及实体类,base64编码保存图片文件,调用flask实现内部ocr接口,通过paddleocr识别,解析结果,base64转图片
文本,文识08图片保存()上,最方便在于整体生成代码,serivce及实体类,base64编码保存图片文件,调用flask实现内部ocr接口,通过paddleocr识别,解析结果,base64转图片
|
12天前
|
JavaScript
js 解析lrc文件(歌词)
js 解析lrc文件(歌词)
14 1
|
23天前
|
关系型数据库 MySQL 数据库连接
蓝易云 - PHP基本语法解析与应用指南
以上只是PHP基本语法的简要概述,要深入了解和掌握PHP,你需要阅读更多的教程和参考资料,并通过实践来提高你的技能。
25 2
|
26天前
|
XML Java 数据格式
深度解析 Spring 源码:揭秘 BeanFactory 之谜
深度解析 Spring 源码:揭秘 BeanFactory 之谜
22 1
|
13天前
|
前端开发 开发者
深入解析Vite.js源码
【7月更文挑战第1天】Vite.js 深入解析:以其无bundle开发、动态ES模块加载提升开发效率;本地HTTP服务器配合WebSocket实现热更新;按需加载减少资源占用;预构建优化生产环境性能;基于Rollup的插件系统增强灵活性。Vite,一个创新且高效的前端构建工具。
20 0
|
17天前
|
存储 安全 Java
Java泛型:深度解析编译时类型安全的核心机制
【6月更文挑战第28天】Java泛型自JDK 1.5起增强了代码安全与复用。它们允许类、接口和方法使用类型参数,如`<T>`在`Box<T>`中。泛型确保编译时类型安全,例如`List<String>`防止了运行时ClassCastException。尽管运行时存在类型擦除,编译时检查仍保障安全。理解泛型核心机制对于优化Java编程至关重要。

推荐镜像

更多