antlr

Spark SQL源码解析(三)Analysis阶段分析

核能气质少年 提交于 2020-04-29 12:34:00
Spark SQL原理解析前言: Spark SQL源码剖析(一)SQL解析框架Catalyst流程概述 Spark SQL源码解析(二)Antlr4解析Sql并生成树 Analysis阶段概述 首先,这里需要引入一个新概念,前面介绍SQL parse阶段,会使用antlr4,将一条SQL语句解析成语法树,然后使用antlr4的访问者模式遍历生成语法树,也就是Logical Plan。但其实,SQL parse这一阶段生成的Logical Plan是被称为Unresolved Logical Plan。所谓unresolved,就是说SQL语句中的对象都是未解释的。 比如说一条语句 SELECT col FROM sales ,当我们不知道col的具体类型(Int,String,还是其他),甚至是否在sales表中有col这一个列的时候,就称之为是Unresolved的。 而在analysis阶段,主要就是解决这个问题,也就是将Unresolved的变成Resolved的。Spark SQL通过使用Catalyst rule和Catalog来跟踪数据源的table信息。并对Unresolved应用如下的rules(rule可以理解为一条一条的规则,当匹配到树某些节点的时候就会被应用)。 从Catalog中,查询Unresolved Logical Plan中对应的关系

VS2013+MVC4,不支持BundleConfig,解决方案

你说的曾经没有我的故事 提交于 2020-04-24 13:54:33
由于没有升级到MVC5,想使用地址重写(CSS和JS压缩并重写地址),创建项目后,发现不支持这个方法!! 以下是本人的随手笔记 参考博客地址:https://www.cnblogs.com/jt789/p/4606972.html 步骤: 1、程序添加三个DLL System.Web.Optimization.dll Antlr3.Runtime.dll WebGrease.dll 2、Views中的Web.Config添加[<add namespace="System.Web.Optimization"/>] <system.web.webPages.razor> <host factoryType="System.Web.Mvc.MvcWebRazorHostFactory, System.Web.Mvc, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" /> <pages pageBaseType="System.Web.Mvc.WebViewPage"> <namespaces> <add namespace="System.Web.Optimization"/> </namespaces> </pages> </system.web.webPages.razor> 3、Web

Spark SQL源码剖析(一)SQL解析框架Catalyst流程概述

匆匆过客 提交于 2020-04-23 06:10:10
Spark SQL模块,主要就是处理跟SQL解析相关的一些内容,说得更通俗点就是怎么把一个SQL语句解析成Dataframe或者说RDD的任务。以Spark 2.4.3为例,Spark SQL这个大模块分为三个子模块,如下图所示 其中Catalyst可以说是Spark内部专门用来解析SQL的一个框架 ,在Hive中类似的框架是Calcite(将SQL解析成MapReduce任务)。Catalyst将SQL解析任务分成好几个阶段,这个在对应的论文中讲述得比较清楚,本系列很多内容也会参考论文,有兴趣阅读原论文的可以到这里看: Spark SQL: Relational Data Processing in Spark 。 而Core模块其实就是Spark SQL主要解析的流程,当然这个过程中会去调用Catalyst的一些内容。这模块里面比较常用的类包括SparkSession,DataSet等。 至于hive模块,这个不用说,肯定跟hive有关的。这个模块在本系列基本不会涉及到,就不多介绍了。 值得一提的是,论文发表的时候还是在Spark1.x阶段,那个时候SQL解析成词法树用的是scala写的一个解析工具,到2.x阶段改为使用antlr4来做这部分工作(这应该算是最大的改变)。至于为什么要改,我猜是出于可读性和易用性方面的考虑,当然这个仅是个人猜测。 另外,

Spark SQL源码剖析(一)SQL解析框架Catalyst流程概述

别等时光非礼了梦想. 提交于 2020-04-23 03:54:15
Spark SQL模块,主要就是处理跟SQL解析相关的一些内容,说得更通俗点就是怎么把一个SQL语句解析成Dataframe或者说RDD的任务。以Spark 2.4.3为例,Spark SQL这个大模块分为三个子模块,如下图所示 其中Catalyst可以说是Spark内部专门用来解析SQL的一个框架 ,在Hive中类似的框架是Calcite(将SQL解析成MapReduce任务)。Catalyst将SQL解析任务分成好几个阶段,这个在对应的论文中讲述得比较清楚,本系列很多内容也会参考论文,有兴趣阅读原论文的可以到这里看: Spark SQL: Relational Data Processing in Spark 。 而Core模块其实就是Spark SQL主要解析的流程,当然这个过程中会去调用Catalyst的一些内容。这模块里面比较常用的类包括SparkSession,DataSet等。 至于hive模块,这个不用说,肯定跟hive有关的。这个模块在本系列基本不会涉及到,就不多介绍了。 值得一提的是,论文发表的时候还是在Spark1.x阶段,那个时候SQL解析成词法树用的是scala写的一个解析工具,到2.x阶段改为使用antlr4来做这部分工作(这应该算是最大的改变)。至于为什么要改,我猜是出于可读性和易用性方面的考虑,当然这个仅是个人猜测。 另外,

spark sql原理---上篇

╄→гoц情女王★ 提交于 2020-04-06 10:51:37
spark sql架构 Spark SQL 的整体架构如下图所示 上图可见,无论是直接使用 SQL 语句还是使用 DataFrame,都会经过如下步骤转换成 DAG 对 RDD 的操作。 Parser 解析 SQL,生成 Unresolved Logical Plan 由 Analyzer 结合 Catalog 信息生成 Resolved Logical Plan Optimizer根据预先定义好的规则对 Resolved Logical Plan 进行优化并生成 Optimized Logical Plan Query Planner 将 Optimized Logical Plan 转换成多个 Physical Plan CBO 根据 Cost Model 算出每个 Physical Plan 的代价并选取代价最小的 Physical Plan 作为最终的 Physical Plan Spark 以 DAG 的方法执行上述 Physical Plan 在执行 DAG 的过程中,Adaptive Execution 根据运行时信息动态调整执行计划从而提高执行效率 Parser Spark SQL 使用 Antlr 进行记法和语法解析,并生成 UnresolvedPlan。 当用户使用 SparkSession.sql(sqlText : String) 提交 SQL 时

关于王银的一些看法

℡╲_俬逩灬. 提交于 2020-03-11 17:13:49
很久没有正儿八经写一些分享了,今天分享一下我对 王垠 的看法,首先贴一下其他网友的看法,主要来源于知乎 网友一 今天早上我把他的文章全部打印成pdf保存了下来,以防哪一天再也访问不到了。对于一个出身于农民家庭的我来说,很多社会上东西。在没有看到王垠的博客之前,我和大多数人一样。被当前社会的主流意识给误导。不懂得应该厌恶什么,应该尊重什么。除了垠神能在计算机科学上给我指导以外。我最大的收获是,在主流人群心里尊重的东西,在垠神那里一文不值。垠神就是一个在冰层上凿冰的人。我在冰层下面看着他,心里充满尊敬 。 网友二 王垠是技术内外对我启发最大的程序员之一,他是极具独立和自由精神的人。很多人嘲笑他,说他没一份工作能做得长久。然而关键在于,你勤勤恳恳 996 供房供车,真的过得比他开心,比他幸福,比他踏实吗?他的人生几乎是字面意义上随心所欲的,试问我们多少人做得到呢? 网友三 敬佩垠神,我认为他是一个真正纯粹的人。知行合一。 网友四 你说王垠的博客没有技术内容?我怀疑你是无脑黑 网友五 我特别欣赏,万里挑一的脑袋,一百年很难再长出一个。他可以没有作品,但他就是万里挑一的特别。 我对王垠的看法 垠神不仅仅告诉我们这是什么技术,而且还告诉了这个适用范围,这尤其困难,这需要丰富的经验和直接,还需要逆天的勇气。 面对"新技术",他在高声说,“且慢,你需要注意到一些问题”。 程序员不怕辛苦

开发者需要了解的领域特定语言(DSL)

牧云@^-^@ 提交于 2020-03-04 15:12:12
领域特定语言是在特定领域下用于特定上下文的语言。作为开发者,很有必要了解领域特定语言的含义,以及为什么要使用特定领域语言。 领域特定语言domain-specific language (DSL)是一种旨在特定领域下的上下文的语言。这里的领域是指某种商业上的(例如银行业、保险业等)上下文,也可以指某种应用程序的(例如 Web 应用、数据库等)上下文。与之相比的另一个概念是 通用语言general-purpose language (GPL,LCTT 译注:注意不要和 GPL 许可证混淆),通用语言则可以广泛应用于各种商业或应用问题当中。 DSL 并不具备很强的普适性,它是仅为某个适用的领域而设计的,但它也足以用于表示这个领域中的问题以及构建对应的解决方案。HTML 是 DSL 的一个典型,它是在 Web 应用上使用的语言,尽管 HTML 无法进行数字运算,但也不影响它在这方面的广泛应用。 而 GPL 则没有特定针对的领域,这种语言的设计者不可能知道这种语言会在什么领域被使用,更不清楚用户打算解决的问题是什么,因此 GPL 会被设计成可用于解决任何一种问题、适合任何一种业务、满足任何一种需求。例如 Java 就属于 GPL,它可以在 PC 或移动设备上运行,嵌入到银行、金融、保险、制造业等各种行业的应用中去。 DSL 的类别 从使用方式的角度,语言可以划分出以下两类: DSL:使用

Antlr(DSL)

柔情痞子 提交于 2020-03-02 08:32:13
Antlr Name:ANother Tool for language for Language Recognition Site: https://github.com/antlr/ https://theantlrguy.atlassian.net/wiki/display/ANTLR3/ANTLR+v3+documentation http://www.antlr3.org/grammar/list.html http://www.crifan.com/files/doc/docbook/antlr_tutorial/release/pdf/antlr_tutorial.pdf 作用:生成某种语言的Lexer, Parser, Tree Walker or Lexer&Parser的combinor 用例: Hibernate解析HQL Spring解析 EL Gemfire(or Geode)解析OQL 版本:3.3(3.3实际上是用2.7依据Antlr.g grammar文件生成的parser) (由这个parser来解析我们的grammar 文件,然后由它的另一个library StringTemplate 来生成我们的parser 或者lexer) 输入:特定语言A的文法文件 (.g文件) 输出:特定语言A的解析程序(可以是Java C# C++ 等等) 文法文件

Java无可匹敌的变身装备,钢铁侠客的绝密味道

耗尽温柔 提交于 2020-02-27 13:59:23
以上几个工具包,有些是比较偏门的,但它们完成的功能却非常酷炫。不仅酷炫,而且非常有用。在领导们频繁开会,使用各种方法论探讨怎么管理文档,怎么自动化,怎么代码审查的时候,你就已经把功能完成了。 我讨厌写一些业务代码,不仅仅因为它们的原始意图不是我设计的,成功了是产品的功劳,失败了代码要背锅。一个重要的原因,就是重复的代码太多,一个复杂的业务逻辑要找到它的Bug,也要下一番“苦力”。这里说的真的是苦力,而不是脑力,说明了大部分是低劣的重复劳动。 所以随着在项目中有了话语权,我会特别善待这些可怜的同学们。一个问题,直到发现的时候,才发现它的低级,但中间的曲折,很少有人能看到,一个非技术出身的管理者对此就很难理解。职位越是高,就越关注整体的目标达成,对个体的感受却关注的很少,这不是一个好的现象。千里之堤,溃于蚁穴。普通研发的整体水平代表了公司的竞争力。哦哦哦,我竟然违背了精英主义论调。 扯远了。下面介绍几个开发中常用的工具包,可以在Java源文件、语法树、字节码之间进行转换。用好了它们,不仅仅能实现一些黑科技,还能大大提高我们的生产力。 1、JavaPoet 有时候,我们要做一些代码生成工具,需要生成一些Java类源文件。如果使用字符串去拼接的话,很容易拼的乱七八糟。为了解放双手,就可以使用工具JavaPoet进行方法或者代码块的构建。它还提供了占位符等一系列方便的操作

How to write Antlr rules in a non-recursive way?

一笑奈何 提交于 2020-02-25 22:46:33
问题 I have the following the expressions I need to parse and(true, false) or(true, false, true) not(or(true, false, true)) and(and(true, false), false) or(or(true, false, true), true) so far I have the following grammar expr : orExpr ; orExpr : OR '(' andExpr (',' andExpr)+ ')' | andExpr ; andExpr : AND '(' equalityExpr (',' equalityExpr)+ ')' | equalityExpr ; equalityExpr : comparison ((EQUALS | NOT_EQUALS) comparison)* ; comparison : notExpr ((GREATER_THAN_EQUALS | LESS_THAN_EQUALS | GREATER