← Back to Glossary

Delta Lake

Delta Lake is an open table format, originally developed by Databricks, that adds ACID transactions, schema enforcement, and time travel to Parquet data stored in a data lake.

Overview

Delta Lake is an open table format built on top of Parquet files. Every write to a Delta table is recorded as a JSON entry in a transaction log (the _delta_log directory), which lists which Parquet files belong to the current version of the table. Readers use this log to reconstruct a consistent snapshot, which is what gives Delta Lake ACID transactions on top of otherwise immutable files in object storage.

Key features

  • ACID transactions — concurrent readers and writers see a consistent table state via the transaction log.
  • Time travel — you can query a previous version of a table by version number or timestamp.
  • Schema enforcement and evolution — writes are checked against the table's schema, with support for controlled schema changes.
  • Deletion vectors and merge support — efficient row-level updates and deletes without rewriting entire files.

Ecosystem beyond Spark

Delta Lake started as a Spark-specific project, but the protocol is now engine-agnostic. delta-kernel-rs and delta-rs are Rust implementations that let non-Spark engines read and write Delta tables without a JVM, and they power Delta support in tools like DuckDB, Polars, and the Python deltalake package.

DuckDB and Delta Lake

DuckDB's delta extension reads Delta tables directly, including time travel to a specific version:

Copy code

INSTALL delta; LOAD delta; SELECT * FROM delta_scan('s3://bucket/warehouse/orders'); -- Attach the table to query a specific version ATTACH 's3://bucket/warehouse/orders' AS orders (TYPE delta); SELECT * FROM orders AT (VERSION => 5);

This lets DuckDB and MotherDuck query Delta tables written by Databricks or Spark jobs directly from object storage, without needing a Spark cluster to read them back.

Related terms

FAQS

Delta Lake keeps a transaction log — a sequence of JSON files in a _delta_log directory — that records which Parquet files make up each version of the table, giving readers a consistent, ACID-compliant view.

No longer. While Delta Lake originated as a Spark project, engine-agnostic Rust implementations like delta-kernel-rs and delta-rs now let engines such as DuckDB, Polars, and the Python deltalake package read and write Delta tables without Spark.

Yes. DuckDB's delta extension provides delta_scan() to read Delta tables directly from local disk or object storage, plus ATTACH ... (TYPE delta) support for querying specific table versions with time travel.