目前已知和了解的SQL解析转义工具有Antlr,Calcite和SparkSQL,就这三种解析转义的优缺点做个简单的阐述
简介
Antlr
是一款非常经典的解析工具,它基于g4文件,只要熟悉其语法机构,即可创建一种新的语言(可以进行词义和语义解析的)。
流程
样例/模板
csvFile: hdr row+ ; hdr : row ; row : field (',' field)* '\r'? '\n' ; field : TEXT | STRING | ;
TEXT : ~[,\n\r"]+ ; STRING : '"' ('""'|~'"')* '"' ; // quote-quote is an escaped quote
|
Antlr在解析这一块的确很优秀,可以指定或者重写语法块以实现更快速、便捷的访问token,但其本身无法对已经创建好的语法树进行更改(我目前了解到的是如此),因此需要自身将解析出来的token再进一步的转换封装(spark和hive就是这样做的)。
而我们在OLAP一期的操作是使用为字符串替换原则,即解析出语法树并记录语法树规则后对单个语法树中的字段进行替换。
Calcite
和Antlr一样,都是SQL语法解析器,不过它是基于javacc的(文件扩展名以jj为后缀),语法结构更接近java语言。
流程
样例/模板
options { JavaCC的选项 }
PARSER_BEGIN(解析器类名) package 包名; import 库名;
public class 解析器类名 { 任意的Java代码 } PARSER_END(解析器类名)
扫描器的描述
解析器的描述 |
Calcite的功能十分强大,不仅有解析还有验证优化过程,且支持动态修改已生成的语法树,可以实现语法树的转义操作,目前flink,kylin都是基于此做的二次开发。
Calcite的解析阶段无需做更多的适配操作,和Antlr的解析时间差不太多,但当加入验证阶段时(模型查询时需要验证字段是否存在),自己手写的Antlr解析+字段验证和Calcite自身的解析+验证就体现出了差距,多次试验发现Calcite的整体耗时要大于Antlr,几乎是Antlr的1.5倍+,且Calcite验证阶段还需要单独编写Schema和Table信息。
Calcite的查询阶段是基于Calcite自身的jdcb方式将验证后的SQL直接查询(实现Calcite支持的查询操作,类似Spark的RDD),可以真正做到一个SQL搞定一切。
SparkSQL
流程
SparkSQL是基于Antrl的二次开发,在解析之上加入了logicalPlan。SparkSQL意在做到对用户而言一条SQL搞定一切,且基于RDD实现分布式查询,性能更为高效。SparkSQL已经发展多年,为更多的人熟悉和了解。
对比
基于以上的介绍,他们的优缺点如下
解析引擎 对比项 | Antrl | Calcite | SparkSQL |
自身特性 | 轻,快,只能做解析,无法进行查询操作 | 功能丰富,查询方面可能是基于内存的 | 功能丰富,支持分布式 |
上手速度 | 快,熟悉语法结构即可 | 慢于Antlr,需要了解多方面的知识 | 较慢,需要了解RDD和logicalPlan |
文档完整度 | 目前能够搜索到的文档基本上能够解决生产问题 | 文档偏少,都是一些基础的使用 | 文档较多,各种问题的解决方案都可以找到 |
新功能修改量 |
|
|
|
其他 |
|
|
|
|
|
|
|