SparkSQL之AstBuilder

news/2025/2/22 1:08:39/

Spark SQL是基于ANTLR实现的,前文中有关于ANTLR的介绍文章《ANTLR实战》和《设计模式之访问者模式》,这篇文章主要介绍的内容是AstBuilder类。

Catalyst中提供了直接面向用户的ParseInterface接口,该接口中包含了对SQL语句、Expression表达式和TableIdentifier数据表标识符的解析方法。AbstractSqlParser是实现了ParseInterface的虚类,其中定义了返回AstBuilder的函数。

整个SQL解析相关的实现如下图所示,其中CatalystSqlParser仅用于Catalyst内部,而SparkSqlParser用于外部调用。其中,比较核心的是AstBuilder,它继承了ANTLR4生成的默认SqlBaseBaseVisitor,用于生成SQL对应的抽象语法树AST(UnresolvedLogicalPlan);SparkSqlAst-Builder继承AstBuilder,并在其基础上定义了一些DDL语句的访问操作,主要在SparkSqlParser中调用。
在这里插入图片描述
当面临开发新的语法支持时,首先需要改动的是ANTLR4文件(在SqlBase.g4中添加文法),重新生成词法分析器(SqlBaseLexer)、语法分析器(SqlBaseParser)和访问者类(SqlBaseVisitor接口与SqlBaseBaseVisitor类),然后在AstBuilder等类中添加相应的访问逻辑,最后添加执行逻辑。

为加深理解Spark SQL生成的语法树结构,可以将Spark SQL编译器部分剥离出来,构造一个类似AstBuilder的访问者类MyVisitor,在实现的访问方法中输出visitor访问操作。类似于下面的代码逻辑,实现SqlBaseBaseVisitor中的所有方法。

public class MyVisitor extends SqlBaseBaseVisitor<String>{public String visitSingleStatement(SqlBaseParser.SingleStatementContext ctx) {System.out.println("visitSingleStatement");return visitChildren(ctx);}.........................
}

MyVisitor中访问方法的类型为String(AstBuilder中的SqlBaseBaseVisitor为AnyRef类型,返回LogicalPlan类型),但不会返回字符串,仅用于输出访问的路径和对AST的理解。构造上述访问者类之后,接下来还需要构造一个Driver程序来驱动上述访问过程,测试下面的SQL语句。

SELECT name FROM student WHERE age > 18

为了便于理解Spark SQL的解析过程,可看GitHub上的项目 ANTLR4-SqlBase。

在Catalyst中,SQL语句经过解析,生成的抽象语法树节点都以Context结尾来命名。如下图所示为案例SQL语句生成的抽象语法树。
在这里插入图片描述
从语法树可以看到,SingleStatementContext是根节点,但是在访问该节点时一般什么都不做,只递归访问子节点。整个遍历访问操作中比较重要的是包含多个子节点的节点。例如QuerySpecificationContext节点,一般将数据表和具体的查询表达式整合在一起。左边的一系列节点对应select表达式中选择的列,中间的From ClauseContext为根节点的系列节点对应数据表,右边的一系列节点则对应where条件中的表达式。

上述语法树的结构比较通用,其他类型的SQL语句生成的语法树大同小异,这里假设在上述语句中加入排序的操作。

SELECT name FROM student WHERE age > 18 order by id desc

加入排序操作后生成的语法树如图4.5所示,可以看到新的语法树在QueryOrganization-Context节点下面加入了SortItem Context节点,代表数据查询之后所进行的排序操作。一般来讲,QueryOrganizationContext为根节点所代表的子树中包含了各种对数据组织的操作,例如Sort、Lim it和W indow算子等。
在这里插入图片描述
从上面案例可以看出,即使非常简单的SQL语句,其语法树的节点也非常多。特别是当查询涉及聚合操作、Join操作和嵌套的子查询时,整棵语法树会变得非常庞大,难以一次完成展示。


http://www.ppmy.cn/news/559473.html

相关文章

弱口令检测 -- WebCrack v(1.1)

要买东西的时候&#xff0c;店家常常说&#xff0c;你要是真心买的&#xff0c;还能给你便宜&#xff0c;你看真心就是不怎么值钱。。。 ---- 网易云热评 一、工具简介 WebCrack是一款web后台弱口令/万能密码批量检测工具&#xff0c;在工具中导入后台地址即可进行自动化检…

WEB安全工具-curl

官网&#xff1a;https://curl.se/ Usage: curl [options...] <url>-d, --data <data> HTTP POST data-f, --fail Fail silently (no output at all) on HTTP errors-h, --help <category> Get help for commands-i, --include Include pro…

web cracker

最新是4.0 Web Cracker v2.0 Final Copyright 1998 by DiTTo Released 12/02/98 This program MAY NOT BE SOLD!IMPORTANT: Please see the end of this document for Version History and Recent Changes! HOMEPAGE & EMAIL:Visit the Web Cracker Home Page at http://we…

crawler

1 网络爬虫 网络爬虫&#xff08;Web crawler&#xff09;&#xff0c;是一种按照一定的规则&#xff0c;自动地抓取万维网信息的程序或者脚本。 1.1 爬虫入门程序 1.1.1 环境准备 1.JDK1.8 2.IntelliJ IDEA 2.IDEA自带的Maven 1.打开IDEA如图所示的界面&#xff0c;选择Pr…

WebBrowser

WebBrowser控件属性&#xff1a; 1、Application 如果该对象有效&#xff0c;则返回掌管WebBrowser控件的应用程序实现的自动化对象(IDispatch)。如果在宿主对象中自动化对象无效&#xff0c;程序将返回WebBrowser控件的自动化对象 2、Parent 返回WebBrowser控件的…

c++ auto学习笔记

一、auto的意义 在C11中赋予auto的意义是&#xff1a;在声明变量时&#xff0c;根据初始化表达式自动推断该变量的类型。声明函数时作为函数返回值的占位符&#xff08;用在函数返回类型后置的情况&#xff09;。 如 auto i 6; //auto推断为intauto func()->int //函数返…

WebCrack:一键自动化日站工具 ——yzddMr6

前言 当初日学校内网的时候有很多后台&#xff0c;就想着能不能批量检测一下弱口令 但是学校的后台系统种类很多&#xff0c;asp aspx php jsp 等等 因为单个网站的爆破比较好整&#xff0c;直接上burp或者py脚本或者hydra 好像还没有听说过批量工具 想着找一找有没有现成…

webscraper 中文教程

webscraper 中文教程 简介 Web Scraper 是谷歌 Chrome 浏览器插件&#xff0c;可自动化提取网页数据&#xff0c;实现不敲代码&#xff0c;指哪爬哪的目标&#xff0c;属于居家出行杀人越货之必备神器。因为集成在chrome浏览器中&#xff0c;因此&#xff0c;想要获取数据&am…