mrkeyoor.com_
Mon 10 Aug 15:47 UTC
Dataevaluationupdated 10 Aug 2026

datafusion

Apache DataFusion is a Rust query engine that lets developers add SQL and dataframe processing to a database, data product, or file-processing application. It supplies the planner, optimizer, Arrow-based execution engine, and common file readers so teams can build a specialized system without writing a query engine from scratch.

Verdict

DataFusion is the strongest open starting point for a Rust team that genuinely needs to build a query-powered system rather than install one. Its Arrow-native execution, broad extension surface, documentation, and active Apache community remove years of engine work. Choose DuckDB or a distributed platform if you want a finished product boundary, and treat DataFusion upgrades like database-engine upgrades with pinned versions and correctness suites.

Setup3/5Easy Rust demo, substantial product integration and compile cost
Docs5/5Deep user, library, SQL, architecture, and upgrade documentation
Community5/5Large Apache community with daily reviews, fixes, and roadmap work
Maturity4/5Production-proven core with fast APIs and correctness fixes evolving

Who it’s for

  • Rust teams building databases, lakehouse components, observability systems, query services, or data pipelines.
  • Developers who need to add custom data sources, SQL functions, operators, optimizer rules, or query languages.
  • Applications already using Apache Arrow and Parquet that want an in-process analytical engine.
  • Platform teams willing to own storage, catalogs, scheduling, security, and service behavior around the engine.
  • Python or Java users prepared to use the project's separate language-binding repositories.

Who it’s NOT for

  • Users looking for a complete database server with durable storage, authentication, administration, and a managed network endpoint: the README positions DataFusion as a library for building such systems.
  • Teams needing distributed cluster execution from this crate alone: the README points to the separate DataFusion Ballista project for that job.
  • Developers who require a prebuilt official Docker image for the CLI: the installation guide says none is published and documents building one from source.
  • Rust applications that cannot coordinate Arrow dependency versions: the getting-started guide warns that DataFusion's public Arrow types must match the application's Arrow version.
  • Extension authors who cannot budget for upgrades: DataFusion documents API evolution, and the 54.0 guide includes removed methods, changed traits, altered coercion behavior, and new return types.
  • Workloads that cannot run SQL correctness tests before upgrading: open issue #23410 reports an incorrect NOT IN result, while issue #24109 reports a nested Parquet filter returning every row.

Setup reality

A proof of concept is straightforward for a Rust developer: add DataFusion and Tokio, create a SessionContext, register a CSV or Parquet source, and run SQL or dataframe expressions. The CLI can be compiled with Cargo or installed through Homebrew on macOS, but there is no official Docker image and a source build can take time. A product integration is a larger engineering commitment involving Arrow version alignment, async runtime choices, memory limits, object-store credentials, catalogs, custom providers, observability, test fixtures, API migrations, and possibly a separate distributed layer.

The engine inside a data product

DataFusion is easiest to understand by what it does not try to be. It is not a database server that you install, create users in, and point dashboards at. It is a Rust library containing the difficult middle of an analytical system: SQL and dataframe planning, optimization, expressions, columnar execution, file scanning, joins, aggregates, and memory-aware parallel work. Developers supply the product around it.

The engine uses Apache Arrow as its in-memory representation. CSV, Parquet, JSON, and optional Avro support are built in, while object-store integration reaches Amazon S3, Azure Blob Storage, and Google Cloud Storage. Execution is vectorized, multithreaded, asynchronous, streaming, and aware of partitions. That makes DataFusion a natural foundation when data already lives in files or Arrow batches and copying it into a traditional database would be the wrong architecture.

Its known-user list is long and varied, including databases, observability products, stream processors, Spark accelerators, lakehouse components, and file-format tools. Those examples are better evidence of its role than a standalone CLI demo. DataFusion succeeds when it disappears inside another system.

Starting is simple, embedding is a commitment

The official Rust example adds datafusion 54.1.0 and Tokio, creates a SessionContext, registers a CSV file, and runs either SQL or dataframe operations. The API is coherent enough to prove a use case in a small program. A command-line client is also available through cargo install datafusion-cli, and macOS users can install it through Homebrew.

The friction starts at packaging. Cargo builds a large query engine and its dependencies. The CLI guide says there is no officially published Docker image, so container users clone the repository and build the supplied Dockerfile. That is acceptable for evaluation, but a production image needs pinned toolchains, cached builds, vulnerability updates, and reproducible artifacts.

Arrow alignment is another concrete requirement. Many public DataFusion APIs expose Arrow and Parquet types. The guide warns that an application's Arrow version must match DataFusion's version or Rust can see apparently identical schemas as distinct types. Re-exported Arrow types are the easiest safe route. This is normal in a tightly integrated Rust ecosystem, but it makes casual mixing of versions painful.

Extension points are the reason to choose it

DataFusion earns its place when an application needs a query engine with its own identity. Developers can add table providers for non-file sources, scalar, aggregate, and window functions, custom logical or physical operators, optimizer rules, file formats, catalogs, and even another query language. SQL and dataframe interfaces share the same planning and execution foundation. Substrait support can move plans across systems.

The optimizer includes expression simplification, projection and filter pushdown, join reordering, and sort and distribution-aware rules. Parquet integration can avoid reading irrelevant data, while execution streams record batches rather than requiring an entire result in memory. Crate features let applications exclude some expression families or add Avro and Parquet encryption. These are building blocks, not switches that create a complete service.

A team still owns durability, authentication, quotas, workload isolation, catalog persistence, network protocols, and operational controls. Cluster execution is a separate choice. The README directs distributed users to DataFusion Ballista, while Comet targets Spark acceleration. If the requirement is simply to query local analytical data from an application, DuckDB offers a more finished boundary. If it is a managed multi-node platform, Spark or another distributed database starts farther along.

Fast evolution has a real maintenance price

DataFusion says it tries to preserve public APIs but continues to improve them. The version 54 upgrade guide shows what that means for extension authors: return types changed, helpers were deprecated or removed, several traits dropped as_any, coercion rules changed query behavior, and Avro internals moved. Physical EXPLAIN text can change too. An application using only SQL and SessionContext may have a modest update, while one implementing execution plans or table providers can face meaningful migration work.

Correctness testing matters just as much as compilation. Open issue #23410 demonstrates a NOT IN query with a null-aware anti join returning a row when SQL logic expects none. Issue #24109 describes Parquet filter pushdown dropping a nested-field predicate after schema adaptation, causing every row to be returned. A fix for the latter was under active review on August 10. These are specific edge cases in a vast engine, but wrong results are more serious than a clean error. Pin a patch release and run representative SQL against a trusted reference engine.

The same activity that exposes bugs also resolves them quickly. On August 10, maintainers merged a serialization fix for order-sensitive limits three days after its report, closed overflow cases in generate_series, corrected empty grouping-set counts, and reviewed multiple Parquet and optimizer fixes. The large queue is not 2,081 confirmed defects because GitHub combines issues and pull requests. It reflects a broad project with substantial concurrent development.

Release health and the decision

The repository was pushed on August 10, 2026, with pull requests moving throughout the day. GitHub's latest-release endpoint returns no release object because DataFusion publishes crate versions and repository tags instead of using GitHub Releases. The newest stable tag listed was 54.1.0, and the tracked 55.0.0 release process was active in August with checks against Python, Comet, Ballista, Delta, Vortex, and Iceberg consumers. That is strong ecosystem discipline, even if the release presentation is less convenient for GitHub tooling.

Documentation is excellent. Separate user and library guides cover SQL, dataframes, architecture, extension APIs, profiling, and every recent major upgrade. The README sends end users toward Python, Java, Ballista, and Comet rather than pretending the core crate is ideal for everyone.

Choose DataFusion when custom query execution is a strategic part of the product and Rust is acceptable. It provides a mature engine and an unusually open design, but it also places database-grade responsibility on its adopter. For teams that only need SQL over files, a finished embedded database will reach production faster. For teams inventing the next data system, DataFusion is difficult to beat.

Alternatives

ProjectWhat it isPick it when
DuckDBAn embedded analytical database with SQL, persistence, extensions, and broad language support.pick this instead when you want a ready-to-use embedded database rather than a Rust engine to reshape and extend.
PolarsA fast dataframe library for Rust and Python with lazy query optimization.pick this instead when dataframe transformations are the product surface and custom SQL-engine internals are unnecessary.
Apache SparkA mature distributed processing platform with cluster scheduling and a large connector ecosystem.pick this instead when you need an established multi-node compute platform more than an embeddable Rust core.

What people are saying

  1. [github-trending] apache/datafusion
  2. [hackernews] Algorithms on billion-scale graph using 10GB RAM: I love DataFusion

Sources

  1. Apache DataFusion repository and README
  2. Apache DataFusion project site
  3. DataFusion Rust example and Arrow version guidance
  4. DataFusion CLI installation guide
  5. DataFusion 54.0 upgrade guide
  6. DataFusion 54.1.0 tag
  7. Open issue: incorrect NOT IN result
  8. Open issue: dropped nested Parquet filter