返回顶部
首页 > 资讯 > 数据库 >什么是扩展Spark SQL解析
  • 619
分享到

什么是扩展Spark SQL解析

2024-04-02 19:04:59 619人浏览 独家记忆
摘要

这篇文章主要讲解了“什么是扩展spark sql解析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“什么是扩展Spark SQL解析”吧! 理论基础

这篇文章主要讲解了“什么是扩展spark sql解析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“什么是扩展Spark SQL解析”吧!

 什么是扩展Spark SQL解析

理论基础

ANTLR

Antlr4是一款开源的语法分析器生成工具,能够根据语法规则文件生成对应的语法分析器。现在很多流行的应用和开源项目里都有使用,比如hadoopHive以及Spark等都在使用ANTLR来做语法分析。

ANTLR 语法识别一般分为二个阶段:

1.词法分析阶段 (lexical analysis)

对应的分析程序叫做 lexer ,负责将符号(token)分组成符号类(token class or token type)

2.解析阶段

根据词法,构建出一棵分析树(parse tree)或叫语法树(syntax tree)

什么是扩展Spark SQL解析

ANTLR的语法文件,非常像电路图,从入口到出口,每个Token就像电阻,连接线就是短路点。

什么是扩展Spark SQL解析

语法文件(*.g4)

上面截图对应的语法文件片段,定义了两部分语法,一部分是显示表达式和赋值,另外一部分是运算和表达式定义。

stat:   expr NEWLINE               # printExpr   |   ID '=' expr NEWLINE         # assign   |   NEWLINE                     # blank   ;  expr:   expr op=('*'|'/') expr     # MulDiv   |   expr op=('+'|'-') expr     # AddSub   |   INT                         # int   |   ID                         # id   |   '(' expr ')'               # parens   ;

接下来,加上定义词法部分,就能形成完整的语法文件。

完整语法文件:

grammar LabeledExpr; // rename to distinguish from Expr.g4  prog:   stat+ ;  stat:   expr NEWLINE               # printExpr   |   ID '=' expr NEWLINE         # assign   |   NEWLINE                     # blank   ;  expr:   expr op=('*'|'/') expr     # MulDiv   |   expr op=('+'|'-') expr     # AddSub   |   INT                         # int   |   ID                         # id   |   '(' expr ')'               # parens   ;  MUL :   '*' ; // assigns token name to '*' used above in grammar DIV :   '/' ; ADD :   '+' ; SUB :   '-' ; ID :   [a-zA-Z]+ ;     // match identifiers INT :   [0-9]+ ;         // match integers NEWLINE:'\r'? '\n' ;     // return newlines to parser (is end-statement signal) WS :   [ \t]+ -> skip ; // toss out whitespace

SqlBase.g4

Spark的语法文件,在sql下的catalyst模块里,如下图:

什么是扩展Spark SQL解析

扩展语法定义

一条正常SQL,例如 Select t.id,t.name from t , 现在我们为其添加一个 JACKY表达式,令其出现在 Select 后面  ,形成一条语句

Select t.id,t.name JACKY(2) from t

我们先看一下正常的语法规则:

什么是扩展Spark SQL解析

现在我们添加一个 jackyExpression

什么是扩展Spark SQL解析

jackExpression 本身的规则就是 JACKY加上括号包裹的一个数字

什么是扩展Spark SQL解析

将 JACKY 添加为token

什么是扩展Spark SQL解析

修改语法文件 如下:

jackyExpression   : JACKY'(' number ')'   //expression   ;  namedExpression   : expression (AS? (identifier | identifierList))?   ;  namedExpressionSeq   : namedExpression (',' namedExpression | jackyExpression )*   ;

扩展逻辑计划

经过上面的修改,就可以测试语法规则,是不是符合预期了,下面是一颗解析树,我们可以看到jackyExpression已经可以正常解析了。

什么是扩展Spark SQL解析

Spark 执行流程

这里引用一张经典的Spark SQL架构

什么是扩展Spark SQL解析

我们输入的 SQL语句 首先被解析成 Unresolved Logical Pan ,对应的是

什么是扩展Spark SQL解析

给逻辑计划添加遍历方法:

 override def visitJackyExpression(ctx: JackyExpressionContext): String = withOrigin(ctx) {    println("this is astbuilder jacky = "+ctx.number().getText)     this.jacky = ctx.number().getText.toInt     ctx.number().getText }

再处理namedExpression的时候,添加jackyExpression处理

// Expressions.    val expressions = Option(namedExpressionSeq).toSeq     .flatMap(_.namedExpression.asScala)     .map(typedVisit[Expression])   //jackyExpression 处理    if(namedExpressionSeq().jackyExpression()!=null && namedExpressionSeq().jackyExpression().size() > 0){      visitJackyExpression(namedExpressionSeq().jackyExpression().get(0))   }

好了,到这里从逻辑计划处理就完成了,有了逻辑计划,就可以在后续物理计划中添加相应的处理逻辑就可以了(还没研究明白... Orz)。

测试

测试用例

public class Case4 {    public static void main(String[] args) {        CharStream ca = CharStreams.fromString("SELECT `b`.`id`,`b`.`class` JACKY(2) FROM `b` LIMIT 10");        SqlBaseLexer lexer = new SqlBaseLexer(ca);        SqlBaseParser sqlBaseParser = new SqlBaseParser(new CommonTokenStream(lexer));        ParseTree parseTree = sqlBaseParser.singleStatement();         AstBuilder astBuilder = new AstBuilder();        astBuilder.visit(parseTree);        System.out.println(parseTree.toStringTree(sqlBaseParser));        System.out.println(astBuilder.jacky());   } }

执行结果

什么是扩展Spark SQL解析

感谢各位的阅读,以上就是“什么是扩展Spark SQL解析”的内容了,经过本文的学习后,相信大家对什么是扩展Spark SQL解析这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

您可能感兴趣的文档:

--结束END--

本文标题: 什么是扩展Spark SQL解析

本文链接: https://lsjlt.com/news/61556.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 什么是扩展Spark SQL解析
    这篇文章主要讲解了“什么是扩展Spark SQL解析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“什么是扩展Spark SQL解析”吧! 理论基础...
    99+
    2024-04-02
  • 在SQL Server中什么是页面和扩展
    在SQL Server中,页面是一种存储数据和索引的基本单元。每个页面有固定的大小,通常为8KB。SQL Server使用页面来存储表数据、索引数据、临时对象等。 扩展是SQL Server中用于管理存储空间的逻辑结构。每个扩展包含8个连续...
    99+
    2024-06-03
    sql server
  • php扩展gd是什么
    这篇文章主要介绍“php扩展gd是什么”,在日常操作中,相信很多人在php扩展gd是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”php扩展gd是什么”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!ph...
    99+
    2023-06-25
  • Spring是怎么扩展解析xml接口的
    目录自定义Spring配置BeanDefinitionParserDelegateDefaultNamespaceHandlerResolverNamespaceHandlerSup...
    99+
    2024-04-02
  • 【赵强老师】什么是Spark SQL?
    一、Spark SQL简介 Spark SQL是Spark用来处理结构化数据的一个模块,它提供了一个编程抽象叫做DataFrame并且作为分布式SQL查询引擎的作用。 为什么要学习Spark SQL?我们已经学习了Hive,它是...
    99+
    2016-01-30
    【赵强老师】什么是Spark SQL?
  • Linq扩展方法是什么
    这篇文章主要讲解了“Linq扩展方法是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Linq扩展方法是什么”吧!LINQ使查询成为了.NET中头等的编程概念,被查询的数据可以是XML(L...
    99+
    2023-06-17
  • 什么是PostgreSQL的扩展,如何安装和管理扩展
    PostgreSQL的扩展是一种可以添加额外功能或功能性的模块,可以通过安装和加载来扩展PostgreSQL的功能。扩展可以包括新的...
    99+
    2024-04-09
    PostgreSQL
  • Java2 HTML扩展方法是什么
    本文小编为大家详细介绍“Java2 HTML扩展方法是什么”,内容详细,步骤清晰,细节处理妥当,希望这篇“Java2 HTML扩展方法是什么”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。打开Java2htmlta...
    99+
    2023-06-03
  • Zookeeper扩展的方法是什么
    这篇文章主要介绍“Zookeeper扩展的方法是什么”,在日常操作中,相信很多人在Zookeeper扩展的方法是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Zookeeper扩展的方法是什么”的疑惑有所...
    99+
    2023-06-05
  • Spark SQL中的窗口函数是什么
    在Spark SQL中,窗口函数是一种特殊的函数,可以用来在特定的窗口或分区中计算结果。窗口函数通常用于处理类似排名、聚合、排序等需...
    99+
    2024-04-09
    Spark
  • access中扩展名指的是什么
    小编给大家分享一下access中扩展名指的是什么,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!2007版本以前的access文件...
    99+
    2024-04-02
  • html文件的扩展名是什么
    这篇文章主要介绍“html文件的扩展名是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“html文件的扩展名是什么”文章能帮助大家解决问题。 ...
    99+
    2024-04-02
  • javascript文档的扩展名是什么
    这篇文章主要介绍“javascript文档的扩展名是什么”,在日常操作中,相信很多人在javascript文档的扩展名是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”ja...
    99+
    2024-04-02
  • Linux上行扩展命令是什么
    本篇内容主要讲解“Linux上行扩展命令是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Linux上行扩展命令是什么”吧!Oh My Zsh 是一款社区驱动的命令行工具,正如它的主页上说的,...
    99+
    2023-06-12
  • java源文件扩展名是什么
    这篇文章主要讲解了“java源文件扩展名是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“java源文件扩展名是什么”吧!1、java源文件扩展名是.java。java编译后的文件扩展名是...
    99+
    2023-06-20
  • Python扩展模块技巧是什么
    本篇内容主要讲解“Python扩展模块技巧是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Python扩展模块技巧是什么”吧!Python扩展模块的开源,可移植到多种操作系统,只要避免使用依...
    99+
    2023-06-17
  • 如何解析Zephir写PHP扩展
    这篇文章给大家分享的是有关如何解析Zephir写PHP扩展的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。众所周知 要写PHP扩展需要用c或者c++ 语言 配合 ext_skel 实现这样对一个没接触过c++的PH...
    99+
    2023-06-15
  • ASP.NET Core扩展库的功能是什么
    本篇内容介绍了“ASP.NET Core扩展库的功能是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!亲爱的.Neter们,在我们日复一日...
    99+
    2023-06-09
  • C#常规扩展性模型是什么
    本篇内容介绍了“C#常规扩展性模型是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!C#常规扩展性模型VSProjectItem 对象是 ...
    99+
    2023-06-17
  • java源文件的扩展名是什么
    这篇文章主要介绍“java源文件的扩展名是什么”,在日常操作中,相信很多人在java源文件的扩展名是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”java源文件的扩展名是什么”的疑惑有所帮助!接下来,请跟...
    99+
    2023-06-20
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作