文章目录
1. Calcite 是什么?
-
Apache Calcite 是一个动态数据的管理框架,可以用来构建数据库系统的语法解析模块
-
不包含数据存储、数据处理等功能
-
可以通过编写 Adaptor 来扩展功能,以支持不同的数据处理平台
-
Flink SQL 使用并对其扩展以支持 SQL 语句的解析和验证
2. Calcite 谁在用?
下图是一张官方提供的生态系统图,可以看到大名鼎鼎的 Hive、Flink、Druid 以及 Spark、ES 等都可以被纳入 Calcite 生态圈。
图1 . Calcite生态圈
3. 概念解析
图2 Calcite 概念
- 关系代数(Relational algebra):即关系表达式。它们通常以动词命名,例如 Sort, Join, Project, Filter, Scan, Sample.
- 行表达式(Row expressions):例如 RexLiteral (常量), RexVariable (变量), RexCall (调用) 等,例如投影列表(Project)、过滤规则列表(Filter)、JOIN 条件列表和 ORDER BY 列表、WINDOW 表达式、函数调用等。使用 RexBuilder 来构建行表达式。
- 表达式有各种特征(Trait):使用 Trait 的 satisfies() 方法来测试某个表达式是否符合某 Trait 或 Convention.
- 转化特征(Convention):属于 Trait 的子类,用于转化 RelNode 到具体平台实现(可以将下文提到的 Planner 注册到 Convention 中). 例如 JdbcConvention,FlinkConventions.DATASTREAM 等。同一个关系表达式的输入必须来自单个数据源,各表达式之间通过 Converter 生成的 Bridge 来连接。
- 规则(Rules):用于将一个表达式转换(Transform)为另一个表达式。它有一个由 RelOptRuleOperand 组成的列表来决定是否可将规则应用于树的某部分。
- 规划器(Planner) :即请求优化器,它可以根据一系列规则和成本模型(例如基于成本的优化模型 VolcanoPlanner、启发式优化模型 HepPlanner)来将一个表达式转为语义等价(但效率更优)的另一个表达式。
4. 整体模块和处理流程
- Catalog – 定义元数据和命名空间,包含 Schema(库)、Table(表)、RelDataType(类型信息)
图3. Catalog 说明
- SQL Parser – 将用户编写的 SQL 语句转为 SqlNode 构成的抽象语法树(AST)
- 通过 JavaCC 模版生成 LL(k) 语法分析器,主模版是 Parser.jj;可对其进行扩展
- 负责处理各个 Token,逐步生成一棵 SqlNode 组成的 AST