Apache Calcite入门

本文涉及的产品
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: Apache Calcite入门

01 简介

Apache Calcite 是一款开源SQL解析工具, 可以将各种SQL语句解析成抽象语法术AST(Abstract Syntax Tree), 之后通过操作AST就可以把SQL中所要表达的算法与关系体现在具体代码之中,将来会有越来越多的数据处理引擎采用Calcite作为SQL解析工具。

如下图,阿里的blink框架已经集成了Calcite的源码:

官方地址:https://calcite.apache.org/

02 功能

Calcite解析SQL的步骤如下:

Calcite有以下主要功能:

  • SQL 解析:Parser步骤中Calcite通过Java CC将SQL解析成未经校验的AST;
  • SQL 校验:Validate步骤主要作用是校证Parser步骤中的AST是否合法,如验证SQL scheme、字段、函数等是否存在; SQL语句是否合法等. 此步完成之后就生成了RelNode树;
  • 查询优化:Optimize步骤主要的作用优化RelNode树, 并将其转化成物理执行计划。主要涉及SQL规则优化如:基于规则优化(RBO)及基于代价(CBO)优化; Optimze 这一步原则上来说是可选的, 通过Validate后的RelNode树已经可以直接转化物理执行计划,但现代的SQL解析器基本上都包括有这一步,目的是优化SQL执行计划。此步得到的结果为物理执行计划。
  • SQL 生成器
  • 数据连接

Execute即执行阶段此阶段主要做的是将物理执行计划转化成可在特定的平台执行的程序,如Hive与Flink都在在此阶段将物理执行计划CodeGen生成相应的可执行代码

03 相关组件

Calcite主要有以下组件:

  • Catelog: 主要定义SQL语义相关的元数据与命名空间。
  • SQL parser: 主要是把SQL转化成AST.
  • SQL validator: 通过Catalog来校证AST.
  • Query optimizer: 将AST转化成物理执行计划、优化物理执行计划.
  • SQL generator: 反向将物理执行计划转化成SQL语句.

3.1 Catalog

Catalog:主要定义被SQL访问的命名空间

主要包括以下几点:

  • schema: 主要定义schema与表的集合,schame 并不是强制一定需要的,比如说有两张同名的表T1, T2,就需要schema要区分这两张表,如A.T1, B.T1;
  • :对应关系数据库的表,代表一类数据,在calcite中由RelDataType定义;
  • RelDataType: 代表表的数据定义,如表的数据列名称、类型等。

Schema:

public interface Schema {
  Table getTable(String name);
  Set<String> getTableNames();
  Set<String> getFunctionNames();
  Schema getSubSchema(String name);
  Set<String> getSubSchemaNames();
  Expression getExpression(SchemaPlus parentSchema, String name);
  boolean isMutable();

Table:

public interface Table {
  RelDataType getRowType(RelDataTypeFactory typeFactory);
  Statistic getStatistic();
  Schema.TableType getJdbcTableType();
}

其中RelDataType代表Row的数据类型, Statistic 用于统计表的相关数据、特别是在CBO用于计表计算表的代价。

一句Sql:

selcct id, name, cast(age as bigint) from A.INFO
  • id, name则为data type field
  • bigint为 data type
  • A 为schema
  • INFO 为表

3.2 SQL Parser

SQL Parser:由Java CC编写,将SQL转化成AST.

  • Java CC: 指的是Java Compiler Compiler, 可以将一种特定域相关的语言转化成Java语言;
  • 在Calcite中将标记(Token)表示为 SqlNode, 并且Sqlnode可以通过unparse方法反向转化成SQL。

例如SQL如下:

cast(id as float)

Java CC 可表示为:

<CAST>
<LPAREN>
e = Expression(ExprContext.ACCEPT_SUBQUERY)
<AS>
dt = DataType() {agrs.add(dt);}
<RPAREN>
....

还有Query Optimizer这些内容,本文不再详述:

04 用法

具体的用法可以参考:

05 文末

参考资料:https://www.jianshu.com/p/2dfbd71b7f0f

本文主要讲解了Apache Calcite的功能、组件及用法,希望能帮助到大家,谢谢大家的阅读,本文完!

目录
相关文章
|
6月前
|
Java 应用服务中间件 Apache
从零手写实现 apache Tomcat-01-入门介绍
创建简易Tomcat涉及理解其作为Java服务器的角色,建立HTTP服务器,实现Servlet接口处理动态和静态内容,以及启动和关闭服务器。项目mini-cat是一个简化版Tomcat实现,支持Servlet、静态网页和基础功能。可通过maven添加依赖并运行测试类快速体验。开源项目位于[GitHub](https://github.com/houbb/minicat)。
|
分布式计算 Java 大数据
Apache SeaTunnel 3 分钟入门指南
Apache SeaTunnel 3 分钟入门指南
794 0
|
数据采集 分布式计算 Hadoop
开源数据质量解决方案——Apache Griffin入门宝典(上)
开源数据质量解决方案——Apache Griffin入门宝典
724 0
|
SQL 消息中间件 分布式计算
Apache Doris 系列: 入门篇-数据导入及查询
Apache Doris 系列: 入门篇-数据导入及查询
820 0
|
SQL 运维 数据可视化
Apache Calcite
Apache Calcite
|
SQL 关系型数据库 Apache
Apache Doris 系列: 入门篇-创建数据表
Apache Doris 系列: 入门篇-创建数据表
916 0
|
6月前
|
分布式计算 Java 大数据
IO流【Java对象的序列化和反序列化、File类在IO中的作用、装饰器模式构建IO流体系、Apache commons-io工具包的使用】(四)-全面详解(学习总结---从入门到深化)
IO流【Java对象的序列化和反序列化、File类在IO中的作用、装饰器模式构建IO流体系、Apache commons-io工具包的使用】(四)-全面详解(学习总结---从入门到深化)
100 0
|
5月前
|
Java 应用服务中间件 Apache
Apache HTTP配置反向代理入门
Apache HTTP配置反向代理入门
427 0
Apache HTTP配置反向代理入门
|
存储 固态存储 关系型数据库
Apache Doris 系列: 入门篇-安装部署
Apache Doris 系列: 入门篇-安装部署
1553 0
|
6月前
|
XML 安全 Java
从零手写实现 apache Tomcat-02-web.xml 入门详细介绍
`web.xml`是Java Web应用的核心配置文件,描述应用工作方式。它包含Servlet、Filter和Listener的定义。例如,示例展示了如何配置名为`my`的Servlet处理`/my`请求,`LoggingFilter`拦截所有请求,以及`MyServletContextAttrListener`监听应用事件。`web.xml`是服务器理解应用结构与行为的指南。迷你版Tomcat实现——mini-cat(开源:https://github.com/houbb/minicat)。

推荐镜像

更多
下一篇
无影云桌面