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

本文涉及的产品
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
云解析 DNS,旗舰版 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内,是独立存在的一个处理文件。

目录
相关文章
|
2月前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
87 2
|
6天前
|
人工智能 自然语言处理 Java
FastExcel:开源的 JAVA 解析 Excel 工具,集成 AI 通过自然语言处理 Excel 文件,完全兼容 EasyExcel
FastExcel 是一款基于 Java 的高性能 Excel 处理工具,专注于优化大规模数据处理,提供简洁易用的 API 和流式操作能力,支持从 EasyExcel 无缝迁移。
54 9
FastExcel:开源的 JAVA 解析 Excel 工具,集成 AI 通过自然语言处理 Excel 文件,完全兼容 EasyExcel
|
3天前
|
自然语言处理 文字识别 数据处理
多模态文件信息抽取:技术解析与实践评测!
在大数据和人工智能时代,企业和开发者面临的挑战是如何高效处理多模态数据(文本、图像、音频、视频)以快速提取有价值信息。传统方法效率低下,难以满足现代需求。本文将深度评测阿里云的多模态文件信息抽取解决方案,涵盖部署、应用、功能与性能,揭示其在复杂数据处理中的潜力。通过自然语言处理(NLP)、计算机视觉(CV)、语音识别(ASR)等技术,该方案助力企业挖掘多模态数据的价值,提升数据利用效率。
15 4
多模态文件信息抽取:技术解析与实践评测!
|
3天前
|
文字识别 自然语言处理 算法
从多模态到精准洞察:深度解析多模态文件信息提取解决方案!
阿里云推出《多模态数据信息提取》解决方案,涵盖文本、图像、音频、视频等多种数据形式的自动化处理。本文从部署体验、功能验证到实际应用,全面解析该方案的能力与潜力,帮助开发者高效提取和整合复杂数据,提升工作效率...
18 3
从多模态到精准洞察:深度解析多模态文件信息提取解决方案!
|
12天前
|
存储 设计模式 算法
【23种设计模式·全精解析 | 行为型模式篇】11种行为型模式的结构概述、案例实现、优缺点、扩展对比、使用场景、源码解析
行为型模式用于描述程序在运行时复杂的流程控制,即描述多个类或对象之间怎样相互协作共同完成单个对象都无法单独完成的任务,它涉及算法与对象间职责的分配。行为型模式分为类行为模式和对象行为模式,前者采用继承机制来在类间分派行为,后者采用组合或聚合在对象间分配行为。由于组合关系或聚合关系比继承关系耦合度低,满足“合成复用原则”,所以对象行为模式比类行为模式具有更大的灵活性。 行为型模式分为: • 模板方法模式 • 策略模式 • 命令模式 • 职责链模式 • 状态模式 • 观察者模式 • 中介者模式 • 迭代器模式 • 访问者模式 • 备忘录模式 • 解释器模式
【23种设计模式·全精解析 | 行为型模式篇】11种行为型模式的结构概述、案例实现、优缺点、扩展对比、使用场景、源码解析
|
12天前
|
设计模式 存储 安全
【23种设计模式·全精解析 | 创建型模式篇】5种创建型模式的结构概述、实现、优缺点、扩展、使用场景、源码解析
结构型模式描述如何将类或对象按某种布局组成更大的结构。它分为类结构型模式和对象结构型模式,前者采用继承机制来组织接口和类,后者釆用组合或聚合来组合对象。由于组合关系或聚合关系比继承关系耦合度低,满足“合成复用原则”,所以对象结构型模式比类结构型模式具有更大的灵活性。 结构型模式分为以下 7 种: • 代理模式 • 适配器模式 • 装饰者模式 • 桥接模式 • 外观模式 • 组合模式 • 享元模式
【23种设计模式·全精解析 | 创建型模式篇】5种创建型模式的结构概述、实现、优缺点、扩展、使用场景、源码解析
|
12天前
|
设计模式 存储 安全
【23种设计模式·全精解析 | 创建型模式篇】5种创建型模式的结构概述、实现、优缺点、扩展、使用场景、源码解析
创建型模式的主要关注点是“怎样创建对象?”,它的主要特点是"将对象的创建与使用分离”。这样可以降低系统的耦合度,使用者不需要关注对象的创建细节。创建型模式分为5种:单例模式、工厂方法模式抽象工厂式、原型模式、建造者模式。
【23种设计模式·全精解析 | 创建型模式篇】5种创建型模式的结构概述、实现、优缺点、扩展、使用场景、源码解析
|
2月前
|
缓存 监控 Java
Java线程池提交任务流程底层源码与源码解析
【11月更文挑战第30天】嘿,各位技术爱好者们,今天咱们来聊聊Java线程池提交任务的底层源码与源码解析。作为一个资深的Java开发者,我相信你一定对线程池并不陌生。线程池作为并发编程中的一大利器,其重要性不言而喻。今天,我将以对话的方式,带你一步步深入线程池的奥秘,从概述到功能点,再到背景和业务点,最后到底层原理和示例,让你对线程池有一个全新的认识。
57 12
|
1月前
|
PyTorch Shell API
Ascend Extension for PyTorch的源码解析
本文介绍了Ascend对PyTorch代码的适配过程,包括源码下载、编译步骤及常见问题,详细解析了torch-npu编译后的文件结构和三种实现昇腾NPU算子调用的方式:通过torch的register方式、定义算子方式和API重定向映射方式。这对于开发者理解和使用Ascend平台上的PyTorch具有重要指导意义。
|
13天前
|
安全 搜索推荐 数据挖掘
陪玩系统源码开发流程解析,成品陪玩系统源码的优点
我们自主开发的多客陪玩系统源码,整合了市面上主流陪玩APP功能,支持二次开发。该系统适用于线上游戏陪玩、语音视频聊天、心理咨询等场景,提供用户注册管理、陪玩者资料库、预约匹配、实时通讯、支付结算、安全隐私保护、客户服务及数据分析等功能,打造综合性社交平台。随着互联网技术发展,陪玩系统正成为游戏爱好者的新宠,改变游戏体验并带来新的商业模式。

推荐镜像

更多