要给内部数据平台加个 SQL 查询入口,团队自己写解析器,写到 join 和子查询才发现是个无底洞。这活别硬造,apache calcite 就是为这种场景准备的:一个不存任何数据、专管 SQL 解析和优化的框架。

它管四件事

解析,把 SQL 文本变成语法树;校验,对着元数据确认表和字段存在不存在;优化,把初始执行计划重排成更快的等价版本;执行,生成可运行的代码。存储它一概不碰,数据留在你自己的系统里,所以 Hive、Flink、Druid、Kylin 这些引擎都拿它当底座,生态验证得很充分。

优化器是重头戏

两条路子。基于规则的 RBO:注册一堆 RelOptRule,比如谓词下推,过滤条件尽量往前挪,先过滤再 join,少搬一大堆数据。基于代价的 CBO:Volcano 框架给每个候选计划估成本,挑最低的走,代价模型能按自家数据特点定制。实践里多数情况是规则和代价混着用,先保证计划合法,再谈最优。

接自己的数据源

写个 Adapter 把自家存储包装成表,声明 schema,它就能用 SQL 查。最省事的入门是官方的 CSV 示例,几十行代码把 CSV 当表查,接完马上能跑 SELECT,拿它理解全流程最合适。想跨两个数据源 join 也行,每个源各接一个 schema,优化器自动把过滤和聚合推到各自那边执行,多源联邦查询的思路就这么来的。

判断:自研查询引擎、做联邦查询、给存储系统补 SQL 能力,上它,省下来的解析器和优化器工作量按人月算;只是应用层跑 SQL,用现成数据库就好,别为了技术栈好看引入大框架。