Apache DataFusion 55 介绍与选型指南

Apache DataFusion 55.2.0 认知篇选型指南:Rust + Arrow 查询引擎的版本基准、双 API 与扩展点架构、功能特性、官方 SQL/DataFrame 示例快速上手及 DuckDB/Polars/ClickHouse 引擎对比。

Apache DataFusionApache DataFusion2026/10/18

Apache DataFusion 55 介绍与选型指南

目标:本文为 Apache DataFusion 的认知篇选型指南,介绍其版本基准、核心概念、功能特性与 DuckDB/Polars/ClickHouse 等引擎的选型对比。本文不做本地安装实测,全部关键论断均基于 DataFusion 官方文档与 crates.io 联网查证,查询日期为 2026-10-18。

一、信息基准

二、软件概述

Apache DataFusion 55.2.0(2026-10-07 发布于 crates.io,Apache License 2.0)是使用 Rust 编写、基于 Apache Arrow 内存格式构建的「非常快、可扩展的查询引擎」,官方定位是构建高质量数据-centric 系统(数据库、DataFrame 库、机器学习与流式应用)的基础引擎;它起源于 Apache Arrow 项目(来源:datafusion.apache.org/user-guide/introduction.html,2026-10-18 查询)。

DataFusion 同时提供 SQL 与 DataFrame 两套 API,原生支持 CSV、Parquet、JSON、Avro 格式,提供 Python 绑定(datafusion-python),并强调可作为库嵌入任意 Rust 项目、在设计的几乎任意环节做定制扩展(来源:user-guide/introduction.html,2026-10-18 查询)。GitHub apache/datafusion 约 9.5k stars(shields.io,2026-10-18 查询)。

三、核心架构与核心概念

3.1 Arrow 内存模型与向量化执行

DataFusion 构建在 Apache Arrow 的列式内存格式之上,执行引擎为「向量化、多线程、流式」(来源:introduction.html Features 列表,2026-10-18 查询)。数据在各算子间以 Arrow RecordBatch 流动,避免序列化开销,这也是它与 Arrow 生态(Parquet、Flight)天然互通的原因。版本配套上,DataFusion 公共 API 大量使用 arrow/parquet crate 的类型,要求项目中 arrow 版本与 DataFusion 依赖一致(55.2.0 要求 arrow ^59.2.0、parquet ^59.2.0,来源:crates.io /datafusion/55.2.0/dependencies,2026-10-18 查询;官方建议直接使用 datafusion::arrow 导出(来源:example-usage.html Arrow Versions 节)。

3.2 双 API:SQL 与 DataFrame

  • SQL API:通过 SessionContext::sql() 提交 SQL,官方另有 SQL 用户指南(来源:example-usage.html)。
  • DataFrame API:read_csv().filter().aggregate().limit() 式链式调用,与 SQL 能力等价(来源:example-usage.html)。

3.3 扩展点体系

官方列出的扩展点包括:自定义标量/聚合/窗口函数、自定义数据源(TableProvider trait)、自定义 SQL 方言与查询语言、自定义计划与执行节点、优化器 pass 等(来源:introduction.html Features,2026-10-18 查询)。这是 DataFusion 作为「引擎库」而非「成品数据库」的核心设计。

3.4 优化器与对象存储

内置查询优化器提供表达式化简与强制转换、投影/谓词下推、排序与分布感知优化、自动 join 重排等;并通过 ObjectStore trait 直接对流式访问 AWS S3、Azure Blob Storage、Google Cloud Storage 等对象存储(来源:introduction.html Features,2026-10-18 查询)。

四、功能特性

  • 功能完整的 SQL 支持与 DataFrame API(来源:introduction.html)。
  • 原生 Parquet/CSV/JSON/Avro 读写;经 TableProvider 支持自定义文件格式与非文件数据源(来源:同上)。
  • 向量化、多线程、流式执行,官方以 ClickHouse 基准(benchmark.clickhouse.com)作为性能参照(来源:introduction.html)。
  • 丰富的扩展点与活跃的生态:官方 Known Users 列出 InfluxDB、GreptimeDB、GlareDB、Ballista(分布式 SQL 引擎)、Comet(Spark 原生执行插件)、delta-rs、SedonaDB、dbt Fusion 引擎等大量基于 DataFusion 构建的系统(来源:introduction.html Known Users,2026-10-18 查询)。
  • 语言绑定:官方收录 datafusion-python(Apache 仓库)、datafusion-java、datafusion-ruby、datafusion-c 等绑定(来源:introduction.html Integrations,2026-10-18 查询)。
  • Rust 兼容策略:支持最近 4 个 Rust stable minor 版本或最近 4 个月内发布的版本(来源:introduction.html Rust Version Compatibility Policy,2026-10-18 查询)。

五、快速上手

以下代码均引自官方用户指南 Example Usage 页(来源:https://datafusion.apache.org/user-guide/example-usage.html ,2026-10-18 查询),本文未本地运行。

添加依赖(官方页面示例,最新稳定版以 crates.io 为准,查询日为 55.2.0):

datafusion = "55.1.0"
tokio = { version = "1.0", features = ["rt-multi-thread"] }

对 CSV 执行 SQL 查询(官方原文示例):

use datafusion::prelude::*;

#[tokio::main]
async fn main() -> datafusion::error::Result<()> {
  // register the table
  let ctx = SessionContext::new();
  ctx.register_csv("example", "tests/data/example.csv", CsvReadOptions::new()).await?;
  // create a plan to run a SQL query
  let df = ctx.sql("SELECT a, MIN(b) FROM example WHERE a <= b GROUP BY a LIMIT 100").await?;
  // execute and print results
  df.show().await?;
  Ok(())
}

用 DataFrame API 处理同一 CSV(官方原文示例):

use datafusion::prelude::*;
use datafusion::functions_aggregate::expr_fn::min;

#[tokio::main]
async fn main() -> datafusion::error::Result<()> {
  // create the dataframe
  let ctx = SessionContext::new();
  let df = ctx.read_csv("tests/data/example.csv", CsvReadOptions::new()).await?;
  let df = df.filter(col("a").lt_eq(col("b")))?
           .aggregate(vec![col("a")], vec![min(col("b"))])?
           .limit(0, Some(100))?;
  // execute and print results
  df.show().await?;
  Ok(())
}

两个示例的输出(官方页面原文):

+---+--------+
| a | MIN(b) |
+---+--------+
| 1 | 2      |
+---+--------+

💡 注意:官方提示 SQL 标识符默认被小写化处理,大写列名需用双引号引用,或设置 datafusion.sql_parser.enable_ident_normalization = false(来源:example-usage.html Identifiers and Capitalization 节)。

六、适用场景与限制

6.1 适用场景

  • 构建自定义数据库/查询引擎:作为嵌入式引擎内核,配合自有 catalog、存储与鉴权(InfluxDB、GreptimeDB、GlareDB 等均基于此构建,来源:introduction.html Known Users,2026-10-18 查询)。
  • Rust 数据管线与本地分析:直接对 Parquet/CSV/JSON 做向量化 SQL/DataFrame 分析,直连对象存储。
  • 为既有系统加速:如 Comet 将其作为 Spark 的原生向量化执行插件(来源:同上)。

6.2 限制与注意

  • 是引擎库而非开箱即用的数据库:单机引擎本体不含分布式执行(分布式需 Ballista 等项目)、无内置持久化存储与完整数据库运维面。
  • 版本节奏快:55.2.0(2026-10-07)之前连续多个 minor 版本快速演进,API 变化频繁,升级需跟随官方 changelog;arrow/parquet 版本必须与 DataFusion 严格对齐(来源:crates.io 与 example-usage.html,2026-10-18 查询)。
  • Rust 生态绑定:主要面向 Rust 项目;其他语言经由第三方/官方收录的绑定使用,成熟度参差。

七、同类选型对比

方案许可证社区活跃度(2026-10-18 查询)版本节奏兼容矩阵
Apache DataFusion 55.2.0Apache-2.0(ASF)GitHub 9.5k stars(shields.io)55.2.0 发布于 2026-10-07(crates.io),minor 版本月度级推进Rust(支持最近 4 个 stable minor),arrow ^59.2.0
DuckDBMITGitHub 42k stars(shields.io)最新 v1.5.6(tag 2026-09-27,tags.atom)面向进程内分析数据库,官方 C/C++/Python/Java 等多语言客户端
PolarsMITGitHub 40k stars(shields.io)最新 py-2.0.0(tag 2026-10-06,tags.atom)Rust 内核 + Python/Node 等 DataFrame 前端
ClickHouseApache-2.0GitHub 50k stars(GitHub 仓库页/shields,2026-10-18 查询)最新 v26.9.21.9-stable(tag 2026-10-17,tags.atom),高频发版独立服务型 OLAP 数据库,自带 SQL 方言与集群能力

选型建议:要在 Rust 项目里「内嵌一个查询引擎并深度定制」(自建数据库/湖仓网关/流引擎内核),选 DataFusion;要给分析师/数据科学家的本地或进程内即席分析一个成品,选 DuckDB 或 Polars(前者偏 SQL、后者偏 DataFrame);需要独立部署、扛大规模分布式 OLAP 生产负载,则选 ClickHouse 这类服务型引擎,而不是嵌入式引擎库。

八、参考链接