开源项目
apache/datafusion avatar
apache/datafusion

Apache DataFusion:用 Rust 写查询引擎,而不是从头造轮子

Apache DataFusion SQL 查询引擎。开箱即用”,DataFusion 提供 SQL 和 DataFrame API、出色的[性能]、对 CSV、Parquet、JSON 和 Avro 的内置支持、广泛的定制以及出色的社区。

9,316 个 Star2,406 个 ForkRustApache-2.0

秒懂

它是什么?
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 的架构决定了它更擅长分析型查询,而不是事务处理或点查。

官方来源

  1. Official documentation
  2. Official README
  3. Project repository
社区笔记

社区笔记