Apache Calcite:构建统一数据查询的基石
Apache Calcite:构建统一数据查询的基石
一、引言
在大数据和云原生时代,数据孤岛和异构数据源的整合成为企业数字化转型的核心挑战。
Apache Calcite 作为一个开源的动态数据管理框架,通过提供标准 SQL 解析、查询优化和跨数据源适配能力,为企业构建统一的数据查询层提供了关键支撑。
Calcite有意地远离了存储和处理数据的任务。如我们所见,这使得它成为在应用程序和一个或多个数据存储位置和数据处理引擎之间的最佳中间层选择。它同样也是构建数据库的完美基础选择: 只需要在它的基础上添加数据。
二、核心架构与技术特性
架构全景图

- 最外层是 JDBC Client 和数据处理系统(Data Processing System),JDBC Client 提供给用户,用于连接 Calcite 的 JDBC Server,数据处理系统则用于对接不同的数据存储引擎。
- 内层是 Calcite 核心架构的流程性组件,包括负责接收 JDBC 请求的 JDBC Server,负责解析 SQL 语法的 SQL Parser,负责校验 SQL 语义的 SQL Validator,以及负责构建算子表达式的 Expression Builder(可以通过 SQL 转换为关系代数,也可以通过 Expression Builder 直接构建)。
- 算子表达式(Operator Expressions)、元数据提供器(Metadata Providers)、可插拔优化规则(Pluggable Rules) 是用于适配不同逻辑的适配器,这些适配器都可以进行灵活地扩展
- 查询优化器(Query Optimizer)是整个 Calcite 的核心,负责对逻辑执行计划进行优化,基于 RBO 和 CBO 两种优化模型,得到可执行的最佳执行计划
Calcite的整体架构中,最为核心的组件是查询优化器(Query Optimizer),负责实现SQL计划树的转换和优化,优化器的SQL优化能力与执行效率直接相关,是SQL处理层的重点和难点。
Calcite的查询优化器主要依赖以下三个组件:
- 运算表达式(Operator Expressions):表示关系代数,是SQL关系代数优化的前提
- 优化规则(Pluggable Rules):实现关系代数的等价转换
- 统计元数据(Metadata Providers):实现CBO代价优化的基础
Calcite对外主要提供两种调用方式:1. 基于JDBC调用;2. 直接基于Java API调用。
SQL 解析与优化
要完成查询优化,一般会按以下步骤操作:
- 把 SQL 解析成 SqlNode:借助 SqlParser 来解析 SQL 语句,进而得到 SqlNode 对象。
- 对 SqlNode 进行验证:使用 SqlValidator 对 SqlNode 开展验证,保证其符合 SQL 语法和元数据要求。
- 把 SqlNode 转换为 RelNode:通过 SqlToRelConverter 把验证后的 SqlNode 转换为逻辑关系代数表达式 RelNode。
- 对 RelNode 进行优化:使用 RelOptPlanner 对 RelNode 实施优化,最终得到优化后的 RelNode。
核心模块
Calcite 的架构设计遵循 “逻辑与物理分离” 的原则,核心模块包括:
SQL 解析与验证
- 解析器(Parser):基于 JavaCC 将 SQL 转换为抽象语法树(AST),支持 ANSI SQL 及方言扩展。
- 验证器(Validator):结合元数据(Catalog)校验表、字段的合法性,自动推导数据类型。
查询优化
- 优化器(Optimizer):
- RBO(基于规则优化):通过内置 200+ 规则(如谓词下推、列剪裁)进行逻辑计划优化。
- CBO(基于成本优化):利用 Volcano/Cascades 框架,结合统计信息选择最优物理执行计划。
执行与适配
- 适配器(Adapter):通过插件化机制连接异构数据源(如 Hive、Elasticsearch、CSV),支持动态注册数据源。
对外接口
Calcite对外提供了丰富的的API和SPI,主要包括以下六个模块:
- 关系代数相关:RelNode(计划树),RelDataType(数据类型),RexNode(行表达式),RelTrait(物理属性)
- SQL解析器相关:SqlNode(AST抽象语法树),SqlParser(SQL解析器),SqlValidator(SQL校验器)
- 元数据相关:Schema,Table,Function(函数)
- JDBC Driver相关:Avatica
- 优化规则相关:RelOptRule(规则)
- COST统计相关:RelOptCost(CBO代价),RelMetadataProvider(统计元数据计算)

三、calcite 项目源码
我们以 Calcite 官方经典的 CSV 案例作为入门示例,来展示下 Calcite 强大的功能。
首先,从 github 下载 calcite 项目源码,git clone https://github.com/apache/calcite.git
, 然后执行 cd calcite/example/csv
进入 csv 目录。
Calcite 为我们提供了内置的 sqlline 命令,可以通过 ./sqlline
快速连接到 Calcite,并使用 !connect
定义数据库连接,model 属性用于指定 Calcite 的数据模型配置文件。
$ cd cd calcite/example/csv
$ ./sqlline
Connected to a local Calcite server version 1.26.0-SNAPSHOT.
Apache Calcite version 1.26.0-SNAPSHOT
sqlline version 1.12.0
sqlline>