Apache DataFusion:用 Rust 写查询引擎,而不是从头造轮子
Apache DataFusion SQL 查询引擎。开箱即用”,DataFusion 提供 SQL 和 DataFrame API、出色的[性能]、对 CSV、Parquet、JSON 和 Avro 的内置支持、广泛的定制以及出色的社区。
秒懂
- 它是什么?
- DataFusion 是一个用 Rust 编写的可扩展 SQL 查询引擎,以 Apache Arrow 为内存格式。它面向的是想构建数据库、分析系统或专用查询引擎的开发者,而不是最终用户。本文分析它的架构、运行方式、局限性和替代方案。
- 适合谁用?
- DataFusion 适合那些需要快速搭建查询引擎的 Rust 开发者,尤其是当你的系统已经或计划使用 Arrow 作为内存格式时。它不适合想要一个开箱即用的数据库的最终用户,也不适合对 SQL 功能要求极高、需要完整 OLAP 语义的团队。
- 能商用吗?
- 可以。Apache-2.0 是宽松许可证:你可以使用、修改并销售基于它的软件,只需保留版权和许可证声明。
- 还在维护吗?
- 在维护。仓库在最近一天内有新的提交。
- 用什么语言写的?
- 主要是 Rust(依据 GitHub 的语言统计)。
以上回答依据项目的 GitHub 数据(最近同步于 2026年9月15日)和我们的分析,不构成法律意见。
开源项目深度解析
它解决什么问题,谁该用它
DataFusion 解决的是构建查询引擎的成本问题。写一个能解析 SQL、优化执行计划、并行扫描数据并输出结果的引擎,通常要花数年时间。DataFusion 用 Rust 实现,把这一整套东西打包成库,开发者可以在此基础上定制。它的目标用户不是数据分析师,而是那些正在构建数据库平台、领域专用查询引擎或数据管道的工程师。README 明确说,它提供 SQL 和 DataFrame API,内置支持 CSV、Parquet、JSON 和 Avro。这意味着你可以从功能完整的引擎起步,然后替换或扩展其中任何部分。
核心机制:列式、流式、向量化执行
DataFusion 的架构核心是列式流式多线程向量化执行引擎。列式意味着数据按列存储和处理,对分析型查询友好。流式意味着数据以流的方式通过算子,不需要全量物化。向量化则是指一次处理一批记录,而不是单条,这能减少函数调用开销。它使用 Apache Arrow 作为内存格式,这让数据在不同组件之间传递时零拷贝。查询规划器负责把 SQL 转成逻辑计划,再优化成物理计划。分区数据源允许并行读取,这是性能的基础。这些机制在 README 的架构链接中有详细说明。
如何运行:从 Cargo.toml 到第一条查询
DataFusion 以 crate 形式发布,通过 Cargo 集成。在你的 Cargo.toml 中添加 datafusion 依赖,然后使用默认 feature 即可获得基础功能。默认 feature 包括 nested_expressions、compression、crypto_expressions、datetime_expressions 等。compression 支持 xz2、bzip2、flate2 和 zstd 压缩格式。crypto_expressions 提供 md5 和 sha256 等函数。要开始使用,可以查看官方安装指南和 Rust 入门示例。README 给出了文档链接,但没给出具体的代码片段。实际使用中,你需要创建 SessionContext,注册数据源,然后执行 SQL 或构建 DataFrame。
定制点在哪里:几乎每一层都可以改
DataFusion 的卖点之一是可定制性。README 声称你可以在几乎所有点进行定制,包括数据源、查询语言、函数和自定义算子。这意味着你可以接入自己的文件格式,或者添加新的 SQL 函数。代价是学习曲线。你需要理解查询规划器、执行引擎和 Arrow 数据格式之间的关系。如果只是想要一个快速查询工具,这种灵活性反而是负担。它假设你愿意深入 Rust 代码去修改行为,而不是通过配置项解决问题。
明显的局限:不是数据库,也不是分布式引擎
DataFusion 本身是一个单机查询引擎,不包含存储层、事务管理或分布式执行。README 提到 Ballista 项目负责分布式执行,但那是独立的子项目。如果你需要多节点查询,必须自己集成 Ballista。另外,DataFusion 的 SQL 支持是分析型的,不适合事务处理。它没有内置的更新或删除语义,也没有索引机制。对于点查或高并发写入,它是错误的选择。还有一个实际限制:它依赖 Rust 生态,这意味着你的团队需要 Rust 技能。
替代方案:Arrow 生态内的其他选择
如果你需要类似功能但不想用 Rust,可以考虑 Apache Spark 或 DuckDB。Spark 使用 Java 和 Scala,提供成熟的分布式 SQL 引擎,但重量级得多。DuckDB 是嵌入式分析数据库,用 C++ 编写,SQL 支持更完整,但不提供 DataFusion 那样的深度定制。DataFusion 的独特之处在于它作为库,而不是应用。你可以把它嵌入到自己的 Rust 服务中,而 DuckDB 或 Spark 更倾向于作为独立系统运行。另一个相关项目是 DataFusion Comet,它把 DataFusion 作为 Spark 的加速器,这说明 DataFusion 也可以作为组件嵌入到更大的系统中。
维护与升级成本
DataFusion 是 Apache 项目,采用 Apache-2.0 许可证,这意味着你可以自由使用、修改和分发,但需要遵守许可证条款。项目活跃,从 README 中的提交活动徽章和 Discord 讨论可以看出来,但具体发布节奏未知。升级成本主要来自 API 变化。DataFusion 的 API 在版本间可能不兼容,尤其是当你深度定制了执行引擎时。建议在升级前查看 changelog 和迁移指南。由于没有获取到具体版本信息,无法给出更精确的评估。
编辑结论
DataFusion 适合那些需要快速搭建查询引擎的 Rust 开发者,尤其是当你的系统已经或计划使用 Arrow 作为内存格式时。它不适合想要一个开箱即用的数据库的最终用户,也不适合对 SQL 功能要求极高、需要完整 OLAP 语义的团队。在采用之前,先确认你的目标负载是否与列式流式执行模型匹配,检查默认 feature 是否满足你的函数需求,并评估 Rust 技术栈的维护成本。DataFusion 的架构决定了它更擅长分析型查询,而不是事务处理或点查。
社区笔记