首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

基于ANTLR4的大数据SQL编辑器解析引擎实践|得物技术

/src/grammar/*.g 语法解析与业务逻辑解耦 在ANTLR4中语法解析和业务逻辑的高度解耦是一个重要的设计理念,优点就是同一个 AST 结构能够在不同的业务逻辑实现之间实现复用。...上下文模式:解析器在处理输入数据时,上下文会在解析树中传递信息。每当进入一个新的语法规则时,都会创建一个新的上下文实例上下文可以存储解析过程中需要的临时信息,例如变量的值、数据类型等。...支持多种数据源:Spark SQL 可以从多种数据源读取数据,包括 HDFS、Parquet、ORC、JDBC 等。...1、异常捕获 ANRLT自动生成的语法解析器中自动为每个规则包裹异常捕获能力,并在catch中尝试错误恢复。...包括扫描后续词法符号来恢复,从不匹配的词法符号中恢复,从子规则的错误中恢复,捕获失败的语义判定。

15110

探究Presto SQL引擎(1)-巧用Antlr

接下来图穷匕首见,展示出我们的真正目的:研究ANTLR4在Presto中如何实现SQL语句的解析。 支持完整的SQL语法是一个庞大的工程。...用该解析器实现select field from table语法,从本地的csv数据源中查询指定的字段。...例如通常我们最常见的查询数据源是数据表。但是在SQL语法中,我们查询数据表被抽象成了relation。...这个relation有可能来自于具体的数据表,或者是子查询,或者是JOIN,或者是数据的抽样,或者是表达式的unnest。在大数据领域,这样的扩展会极大方便数据的处理。...五、总结 本文基于四则运算器和使用SQL查询csv数据两个案例阐述了ANTLR4在项目开发中的应用思路和过程,相关的代码可以在github上看到。

2.2K10
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    探究Presto SQL引擎(1)-巧用Antlr

    ANTLR4规则是基于正则表达式定义定义。规则的理解是自顶向下的,每个分号结束的语句表示一个规则 。...接下来图穷匕首见,展示出我们的真正目的:研究ANTLR4在Presto中如何实现SQL语句的解析。 支持完整的SQL语法是一个庞大的工程。...用该解析器实现select field from table语法,从本地的csv数据源中查询指定的字段。...例如通常我们最常见的查询数据源是数据表。但是在SQL语法中,我们查询数据表被抽象成了relation。...这个relation有可能来自于具体的数据表,或者是子查询,或者是JOIN,或者是数据的抽样,或者是表达式的unnest。在大数据领域,这样的扩展会极大方便数据的处理。

    1.7K30

    如何愉快地写个小parser

    我亲眼看见一个同事在费力地用perl一行行解析某个系统的数据文件,却压根没想到写个BNF。BNF对他来说,不是一种选择。」 很多同学不解,问我:lex/yacc不是写编译器 [1] 的么?...如果你经常使用函数式编程语言,你会发现,这种规则的撰写似曾相识。 bison使用的描述规则的语法是BNF的变体。 以下是编译和执行的结果,作为展示,我仅仅把语法树中我感兴趣的内容打印出来了: ?...从上面的编译过程里,你可以看到,flex/bison是一个C语言的DSL。因此,你可以在处理词法和语法的过程中嵌入C代码,处理(transform)你需要的结果。...通过这个form,我们可以生成两种数据,一种是form的schema,另一种是form的data。所以关键的是,我们如何从form数据里解析出合适的数据结构,为生成schema和data做准备。...接下来我们讲一下另一个神器 antlr4。我也是在撰写这篇文章的时候才接触antlr4,还在第一次亲密接触中。

    3.2K100

    日常运维|语法分析解析工具之ANTLR4(一)

    用ANTLR实现数据加载器、语言解释器、语言翻译器。基于自动生成的语法分析树解析文件。...ANTLR 是一款强大的语法分析器生成工具,可用于读取、处理、执行和翻译结构化的文本或二进制文件。...Windows:window任意自己想放的位置。2)配置环境变量vim ~/.bash_profile### Antlr pathexport CLASSPATH="....语言是由一系列有意义的语句组成,语句是由词组组成,词组是由子词组和词汇符号组成。例如:大象,你,我们,狸花猫。程序是如何来解析这些我们已经熟悉的语言,转变为计算机可以理解的特征性符号?...ArrayInitParser(tokens); ParseTree tree = parser.init(); System.out.println(tree.toStringTree(parser));}在程序中执行

    1.3K20

    打破国外垄断,开发中国人自己的编程语言(1):编写解析表达式的计算器

    这几种工具都是依赖于文法生成词法分析器和语法分析器的,例如,在antlr4中,如果要识别加减乘除四则运算,只需要编写下面的文法即可。...文法如下: r : 'hello' ID; 在Antlr4中,每一个文法都要用分号(;)结尾,如果是固定的字符串,如关键字,用单引号括起来。如'hello'。 ID表示任意的标识符,也是终结符。...所谓终结符,是指不能再继续往下推导的符号(相当于树的叶子节点)。在Antlr4中,终结符标识用由首字母大写的字符串表示,如ID。而非终结符(可以继续往下推导)用首字母小写的字符串表示,如r。...其实这两种遍历AST的方式的原理类似,都是遇到了一个节点,就会调用相应的回调方法,然后将必要的信息作为参数传入回调方法,用户可以在回调方法中完成代码生成、数据处理、中间代码优化等工作。...、输出是AST) (4)开始遍历AST 这4步已经在Hello类中做了详细的注释,大家可以自行查看。

    2.4K40

    antlr4入门篇

    在接下来的内容中,我将讨论antlr-4.7.1-complete.jar,该文件具有工具,运行时以及其他任何支持库(例如,ANTLR v4是用v3编写的)。...嵌入式代码可以出现在:@header以及@members命名的动作,解析器和词法分析器规则,异常捕获规范,解析器规则的属性部分(返回值,参数和局部变量)以及某些规则元素选项(当前谓词)。...在grammar标头上没有前缀定义的语法是可以同时包含词法和解析器规则的组合语法。要制作仅允许解析器规则的解析器语法,请使用以下标头。 parser grammar Name; ......任何已命名的动作,例如@members都会被合并。通常,应避免在导入语法中的命名动作和规则内的动作,因为那样会限制它们的重用。ANTLR还忽略导入语法中的任何选项。 导入的语法也可以导入其他语法。...ANTLR在主词法语法中将导入的规则添加到规则列表的末尾。这意味着主语法中的词法分析器规则优先于导入的规则。

    4.4K10

    元数据解读

    各自包含内容如下: 业务元数据: 指标名称、计算口径、业务术语解释、衍生指标等 数据概念模型和逻辑模型 业务规则引擎的规则、数据质量检测规则、数据挖掘算法等 数据血缘和影响分析 数据的安全或敏感级别等...还包括未采集数据资产管理平台的元数据信息,实际数据还分布在各个源系统的数据,需要抽取、转换、清洗和加载到数据平台的相关流程和ETL工具,便于业务用户元数据查找和数据使用。...数据热度应随着时间的推移,数据价值会变化,应动态更新数据热度等级,推动数据从产生到销毁数据生命周期管理。总之,在成本可控、可量化、可管理的前提下,从数据中挖掘出更多有效的数据价值。...统一SQL路由引擎是使用Antlr4实现的词法文件,具体实现可参考Antlr4实战:统一SQL路由多引擎。...在存储、计算和人力成本合理可控、可管理的前提下,使数据价值得最大发挥,是数据全生命周期管理重要组成部分。是提升数据价值发挥的前提,是数据治理的基石。

    1.2K51

    Antlr实战之JSON解析器slowjson

    最近一直在学习编译原理,然后就了解到了antlr4这个强大的工具,antlr的全称是(Another Tool for Language Recognition),是一款很强大的词法和语法分析工具,虽然是用...它的主要作用就是你可以用巴科斯范式来描述语法规则,然后它帮你生成对应的解析器。 大家都知道实践是最好的学习方式,要快速深刻地理解antlr的操作和相关接口就不得不找一个练手的东西。...实际上你并不需要自己动手写词法分析器、语法分析器……,今天的主角antlr都会帮你生成,你只需要用巴科斯范式把json的语法规则描述清楚就行了,这份描述你可以直接在json.org找到,在antlr的github...这里我直接用antlr提供的规则描述。...WS : [ \t\n\r] + -> skip ; 把这个文件保存成 JSON.g4,然后执行下面命令,当然前提是你得正确安装antlr4。

    1.4K10

    Antlr4 语法解析器(下)

    Antlr4规则文法: 注释:和Java的注释完全一致,也可参考C的注释,只是增加了JavaDoc类型的注释; 标志符:参考Java或者C的标志符命名规范,针对Lexer 部分的 Token 名的定义,...一般来说,面向程序静态分析时,都是使用访问者模式的,很少使用监听器模式(无法主动控制遍历AST的顺序,不方便在不同节点遍历之间传递数据) Antlr4词法解析和语法解析 如前面的语法定义,分为Lexer...Spark & Antlr4 Spark SQL /DataFrame 执行过程是这样子的: ? 我们看下在 Spark SQL 中是如何使用Antlr4的....通过观察这棵树,我们可以发现针对我们的SELECT语句,比较重要的一个节点,是querySpecification节点,实际上,在AstBuilder类中,visitQuerySpecification...以下是querySpecification在Spark SQL 中实现的 代码: /** * Create a logical plan using a query specification

    3.6K20

    一文了解函数式查询优化器Spark SQL Catalyst

    sparkSql pipeline sparkSql的catalyst优化器是整个sparkSql pipeline的中间核心部分,其执行策略主要两方向, 基于规则优化/Rule Based Optimizer...parser切词 Spark 1.x版本使用的是Scala原生的Parser Combinator构建词法和语法分析器,而Spark 2.x版本使用的是第三方语法解析器工具ANTLR4。...Spark2.x SQL语句的解析采用的是ANTLR4,ANTLR4根据语法文件SqlBase.g4自动解析生成两个Java类:词法解析器SqlBaseLexer和语法解析器SqlBaseParser。...然后在parsePlan过程中,使用AstBuilder.scala将ParseTree转换成catalyst表达式逻辑计划LogicalPlan。...最重要的元数据信息就是, 表的schema信息,主要包括表的基本定义(表名、列名、数据类型)、表的数据格式(json、text、parquet、压缩格式等)、表的物理位置 基本函数信息,主要是指类信息

    3K20

    元数据:数据治理的基石

    图书目录中的信息解决了一个十分关键的问题,就是如何帮助用户在图书馆快速地、准确地找到想要的资料。...各自包含内容如下: 业务元数据: 指标名称、计算口径、业务术语解释、衍生指标等 数据概念模型和逻辑模型 业务规则引擎的规则、数据质量检测规则、数据挖掘算法等 数据血缘和影响分析 数据的安全或敏感级别等...元数据生命周期 笔者这里以集中式元数据架构为例讲解,通过对数据源系统的元数据信息采集,发送Kafka消息系统进行解耦合,再使用Antlr4开发各版SQL解析器,对元数据信息新增、修改和删除操作进行标准化集中整合存储...还包括未采集数据资产管理平台的元数据信息,实际数据还分布在各个源系统的数据,需要抽取、转换、清洗和加载到数据平台的相关流程和ETL工具,便于业务用户元数据查找和数据使用。...数据热度应随着时间的推移,数据价值会变化,应动态更新数据热度等级,推动数据从产生到销毁数据生命周期管理。总之,在成本可控、可量化、可管理的前提下,从数据中挖掘出更多有效的数据价值。

    1.3K11

    MySQL Shell 8.0.32 for GreatSQL编译二进制包

    MySQL Shell要求配套的antlr4版本必须是4.10.0,配套的protobuf必须是3.19.4,其他版本都不行。...在编译antlr4时还要再下载googletest依赖包,这个下载地址也是要访问国外网站的,在内网环境中会失败,因此我antlr4源码包微调了下,把googletest依赖包也打进去了,也可以通过微调代码略过该步骤...root root 20343832 Jan 20 21:41 greatsql-shell-8.0.32-25-centos-glibc2.28-x86_64.tar.xz 接下来回退到宿主机,将容器中的二进制包拷贝出来...代码包中相应位置,再修改antlr4代码,略过下载步骤,详见下面的做法: $ cd /opt/antlr4-4.10/runtime/Cpp/ # 新建目录,并将下载的googletest压缩包放在该目录下...编译MySQL Shell 3.1 编译MySQL 8.0.32 在MySQL 8.0.32源码目录中,编译生成MySQL客户端相关依赖库,这是编译MySQL Shell之前要先做的事: $ cd /opt

    17910

    使用antlr4构造我的语法树

    1.1、词法(Lexer) 英语一般用空格和标点将单词隔开,但是在计算机,仅仅用空格和标点分割是不够的。比如“a!=5“。...词法规则玩玩是用类似于正则语法的表达式生成“有限状态机”算法,并根据这些算法切割出token。 词法规则负责从输入读取,并解析成一个个token符号。...比如说PROJECT: "antlr4_code_gen" 1.2.2 匿名隐式词法 他的位置在于parser之后,但是在显式词法之前。一般都是以“T__数字”表示。...image.png image.png 1.3、语义分析 语义分析的目的是消除语义中模棱两可的“二义性”。比如一个变量同时定义在花括号外部和内部,那么到底该用哪一个。...Bbcode.g4的规则如下: image.png 生成命令: antlr4 -Dlanguage=Cpp -visitor .

    9.2K332

    分布式sql引擎原理分析-逻辑执行计划生成

    Parser Parser的过程实际是一个把sql语句根据分词规则及语法规则再组装成基本AST的过程。当前大部分都是使用的Antlr4工具。...是在presto-parser中定义,其中分词器: 1525596488_53_w554_h268.png 由于Antlr4是业内使用最多也是最成熟的方案,所以资料也非常多,这里就不赘述了,工具更多内容可参考...在相同的SubPlan(执行逻辑一样,数据split不通)中可以多个节点的task中并发执行。...其中Source即是分片从数据源读数据;Fixed则是将读取的数据分散到分布式节点上进行处理,包括局部聚合、局部join及局部数据写入等;Single则是将所有结果进行汇总处理,并返回结果,只在单个节点上执行...在presto中的划分是依据logicalPlan逻辑执行计划树的PlanNode来决定的。

    6.8K226

    MySQL Shell 8.0.32 for GreatSQL编译二进制包

    MySQL Shell要求配套的antlr4版本必须是4.10.0,配套的protobuf必须是3.19.4,其他版本都不行。...在编译antlr4时还要再下载googletest依赖包,这个下载地址也是要科学上网的,在内网环境中会失败,因此我antlr4源码包微调了下,把googletest依赖包也打进去了,也可以通过微调代码略过该步骤...root root 20343832 Jan 20 21:41 greatsql-shell-8.0.32-25-centos-glibc2.28-x86_64.tar.xz 接下来回退到宿主机,将容器中的二进制包拷贝出来...代码包中相应位置,再修改antlr4代码,略过下载步骤,详见下面的做法: $ cd /opt/antlr4-4.10/runtime/Cpp/ # 新建目录,并将下载的googletest压缩包放在该目录下...编译MySQL Shell 3.1 编译MySQL 8.0.32 在MySQL 8.0.32源码目录中,编译生成MySQL客户端相关依赖库,这是编译MySQL Shell之前要先做的事: $ cd /opt

    19110

    Spark SQL 整体介绍

    关系数据库中sql执行流程 那么在关系数据库中,当我们写完一个查询语句进行执行时,发生的过程如下: 整个执行流程是:query -> Parse -> Bind -> Optimize -> Execute...tree,在解析的过程中还会检查我们的sql语法是否有错误,比如缺少指标字段、数据库中不包含这张数据表等。...他们采用的策略是首先把sql查询语句分割,分割不同的部分,再进行解析从而形成逻辑解析tree,然后需要知道我们需要取数据的数据表在哪里,需要哪些字段,执行什么逻辑,这些都保存在数据库的数据字典中,因此bind...部分,然后找到数据源之数据表,最后生成select的部分,我们的最终结果。...解析成Unresolved LogicalPlan,在这个解析过程中对hiveql语句使用getAst()获取AST树,然后再进行解析; 2.使用analyzer结合数据hive源数据Metastore

    8310

    Antlr4实战:统一SQL路由多引擎

    Antlr在Hadoop整个生态系统应用较为广泛,如Hive 词法文件是Antlr3写的;Presto词法文件也Antlr4实现的;SparkSQL词法文件是用Presto的词法文件改写的;还有HBase...词法和语法规则 语法规则: 语法规则总是以小写字母开头,首字母以后的字符,可是大小写字母、数字和下划线。最基本的形式是规则名称后面紧接着一个备选分支“|”,然后是一个分号。...位于花括号中的文本块,识别器根据它们在语法中的位置,在不同的时机触发它。...但因Hive天生支持隐式转换,再加上没有标准化建模的数据仓库(没有指定数据标准,同一个通用字段,在不同表中有不同的数据类型等)会给其增加路由其他引擎执行的难度,这里实现部分简单的隐式转换功能,以后会再添加一层语义层...Antlr4解析工具用途蛮多的,如在做数据治理的元数据管理时,做动态字段级血缘关系的数据地图,SQL重写优化,DSL实现等等。

    10K41

    如何实现一个SQL解析器

    怎么判断选择的 SQL 解析器可以满足当前的技术要求?2.1 传统的SQL查询传统的SQL查询,依赖完整的数据库协议。比如数据存储在MySQL、Oracle等关系型数据库中,有标准的SQL语法。...我们可以通过不同的SQL语句来实现业务需求,如下图所示:但是,在处理海量数据的时候,关系型数据库是难以满足实际的业务需求的,我们需要借助大数据生态圈的技术组件来解决实际的业务需求。...在使用SQL解析器时,解析SQL的步骤与我们解析Java/Python程序的步骤是非常的相似的,比如:在C/C++中,我们可以使用LEX和YACC来做词法分析和语法分析在Java中,我们可以使用JavaCC...比如如下SQL语句: SQL示例SELECT name FROM tab WHERE id=1001;约定规则如下:上表中,红色的内容通常表示终结符,它们一般是大写的关键字或者符号等,小写的内容是非终结符...在大数据的一些SQL框架里面有有广泛的应用,比如Hive的词法文件是ANTLR3写的,Presto词法文件也是ANTLR4实现的,SparkSQLambda词法文件也是用Presto的词法文件改写的,另外还有

    2.6K31

    认识这对搭档,解决90%的查询问题

    你可能会说了,把原数据里的A列和B列调换一下顺序不就轻易地避开了上面的问题吗?但是,这样做原始数据就发生了改变,在工作中很多时候我们拿到的表数据,标题中是会有合并单元格的,这就更限制了列的移动。...语法规则如下: index(单元格区域,第几行,第几列) 单元格区域:就是要查找的数据范围; 第几行:在查找范围的第几行; 第几列:在查找范围的第几列。(其中“第几列”是可以省略的。)...如果数据量非常大,或者要查找的员工非常多,难道我还要靠肉眼来看靠手指来数数吗? 所以,这时候就得要有一个函数来告诉index,让它去取第几个。下面隆重请出index的最佳搭档:match函数。...这个案例中,我们愉快地就写下了这样的公式 =match("猴子大大",$B$2:$B$11,0) 返回结果是7,表示匹配到“猴子大大”在姓名列的第7行。...实际工作中,我们面对的可能是很庞大的数据,要查询的列会很多,手动地一个列对应一个公式的写下来,不仅效率低下,还容易出错。 那有没有办法可以只写一次公式,就能返回所有列的结果吗?办法当然是有的。

    82720
    领券