antlr

【spark系列4】spark 3.0.1集成delta 0.7.0原理解析--delta自定义sql

心已入冬 提交于 2020-12-28 01:20:21
前提 本文基于 spark 3.0.1 delta 0.7.0 我们都知道delta.io是一个给数据湖提供可靠性的开源存储层的软件,关于他的用处,可以参考 Delta Lake,让你从复杂的Lambda架构中解放出来 ,于此类似的产品有hudi,Iceberg,因为delta无缝集成spark,所以我们来分析一下delta集成spark的内部原理以及框架,对于spark 3.x 与delta的集成是分两部分的,一部分是delta自定义的sql语法,另一部分是基于Catalog plugin API的DDL DML sql操作(spark 3.x以前是不支持的) 我们今天先分析第一部分 delta自定义的sql语法 自定义的DeltaDataSource 我们在用delta的时候,得指定delta特定的格式,如下: val data = spark.range(5, 10) data.write.format("delta").mode("overwrite").save("/tmp/delta-table") df.show() 那这个delta datasource是怎么集成到spark呢?我们来分析一下: 直接到 DataStreamWriter ,如下: val cls = DataSource.lookupDataSource(source, df

How to make ANTLR consume all visible elements?

邮差的信 提交于 2020-12-26 11:06:20
问题 This is my grammar: grammar test; text: foo EOF; foo: 'X' | foo '!' | foo '?' | foo tail ; tail: (' ' foo)+; I'm parsing this text: X? X! X X This is the tree I'm getting: What should change in the grammar so that I get only one tail element with a collection of all foo elements inside? In the real world the task is way more complex, and using only a scanner is no solution to it. 回答1: As far as I can tell, what you want is this: item: 'X' ('!' | '?')*; // Alternatively to get a tree per

从HiveQL到MapReduce job过程简析

旧时模样 提交于 2020-12-25 02:42:07
一、简述 HiveQL是一种声明式语言,用户提交查询,而Hive会将其转换成MapReduce job,如下图。一般来说大部分时间可以无视这个执行过程的内部逻辑,但是如果能了解这些底层实现细节,在调优的时候就会更得心应手。 二、过程 将HiveQL转化为MapReduce任务,整个编译过程主要分为六个阶段: Antlr定义SQL的语法规则,完成SQL词法,语法解析,将SQL转化为抽象语法树AST; 遍历AST,抽象出查询的基本组成单元查询块QueryBlock; 遍历QueryBlock,将QueryBlock转化为逻辑查询计划OperatorTree; 逻辑层优化器进行OperatorTree变换,合并不必要的ReduceSinkOperator,减少shuffle数据量; 遍历OperatorTree,翻译为MapReduce任务; 物理层优化器进行MapReduce任务的变换,生成最终的执行计划。 1. 将SQL转为AST (1) ANTLR (Another Tool for Language Recognition) 是一个语法分析器( Parser ),可以用来构造领域语言。它允许我们定义识别字符流的词法规则和用于解释Token流的语法分析规则,然后,ANTLR将根据用户提供的语法文件自动生成相应的词法/语法分析器。用户可以利用他们将输入的文本进行编译,并转换成其他形式

蚂蚁java六面,终获offer,面经+面试题(大数据必考+后端面试题+JVM+Java面经+Spring+Redis)

妖精的绣舞 提交于 2020-11-08 11:10:58
前言 今天给大家分享一个小伙伴的蚂蚁金服六面经验,虽然在面试过程中被血虐,没想到最后还是拿到了offer 一面 介绍一下自己 问项目经历, 聊"数据同步" 接着聊上了 K8S 的项目 有没有什么钻研得比较深得技术?(我:kubernetes, golang, prometheus, java) kubernetes 的架构是怎么样的? 这个问题很大,拆成 apiserver、controller、kubelet、scheduler 讲了一下 golang 与 java 的比较 这个问题又很大,当时主要对比了 vm、协程支持、面向对象和泛型的区别、以及自己对各自使用场景的一些理解 golang 的 gc 算法 知道是三色标记,不过细节说不上来 从无限的字符流中, 随机选出 10 个字符 没见过也没想出来,查了一下是蓄水池采样算法,经典面试题,没刷题吃亏了 怎么扩展 kubernetes scheduler, 让它能 handle 大规模的节点调度 单节点提速:优选阶段随机取部分节点进行优选;水平扩展 scheduler 节点,pod 做一致性 hash 来决定由哪个scheduler 调度 你有什么想问我的? 一面其实有点没放开,面试官对我的回答没有什么反馈和深入,所以我当时面完觉得自己其实已经挂了,后来收到二面电话着实吃惊了一下。 二面 先聊了聊项目 给 Prometheus

Go实现自定义语言的基础

我是研究僧i 提交于 2020-11-06 10:35:03
0x01 自言自语 一直就对解析文档,比较感兴趣,一直没深入研究,只停留在仅知道 Lex & yacc 和 antlr 的名词阶段,最近看了go-zero的api解析器,觉得甚好,是时候花时间学习一下了。 简单看了go-zero发现是自己实现了词法分析、语法解析,这不符合我的一贯偷懒作风,所以并未其源码开始学习。既然用golang那么他自带的goyacc就是我学习的不二之选。当然你可能会听说Lex&yacc 已经很古老了,antlr更先进一点。但是既然goyacc能成为golang官方工具,那么肯定还是值得你学习的。 goyacc的文档非常的少,少到什么程度?少到你未来一定能搜到这篇。甚至连github上的使用例子也不多,大致就分两类:计算器、sql解析器,其中计算器目测是国外某大学的课程。 所以研究goyacc我花了好几个通宵、掉了少许头发。不经让这篇文章有了一个营销文案:花了一夜时间,搞懂了外国的一堂编译原理课。 个人对技术文章的理解是,文章可以有自己的观点、啰嗦、甚至幽默,但尽量不要放在学术部分,毕竟技术是严禁的。所以下面描述,我可尽能做一个无情的打字机,尽可能的按照文档风描述。 0x02 goyacc简易入门 安装 goyacc golang 1.8 版本之前 yacc 直接再带与go tool 无需自行安装。 鉴于使用的频率太少,遂在 golang 1.8 版本后

Go实现自定义语言的基础

喜夏-厌秋 提交于 2020-09-30 13:41:35
0x01 自言自语 一直就对解析文档,比较感兴趣,一直没深入研究,只停留在仅知道 Lex & yacc 和 antlr 的名词阶段,最近看了go-zero的api解析器,觉得甚好,是时候花时间学习一下了。 简单看了go-zero发现是自己实现了词法分析、语法解析,这不符合我的一贯偷懒作风,所以并未其源码开始学习。既然用golang那么他自带的goyacc就是我学习的不二之选。当然你可能会听说Lex&yacc 已经很古老了,antlr更先进一点。但是既然goyacc能成为golang官方工具,那么肯定还是值得你学习的。 goyacc的文档非常的少,少到什么程度?少到你未来一定能搜到这篇。甚至连github上的使用例子也不多,大致就分两类:计算器、sql解析器,其中计算器目测是国外某大学的课程。 所以研究goyacc我花了好几个通宵、掉了少许头发。不经让这篇文章有了一个营销文案:花了一夜时间,搞懂了外国的一堂编译原理课。 个人对技术文章的理解是,文章可以有自己的观点、啰嗦、甚至幽默,但尽量不要放在学术部分,毕竟技术是严禁的。所以下面描述,我可尽能做一个无情的打字机,尽可能的按照文档风描述。 0x02 goyacc简易入门 安装 goyacc golang 1.8 版本之前 yacc 直接再带与go tool 无需自行安装。 鉴于使用的频率太少,遂在 golang 1.8 版本后