---
title: "Delta Lake"
description: "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."
canonical: "https://motherduck.com/glossary/delta-lake/"
related:
  - title: "DuckLake Architecture Deep Dive"
    url: "https://motherduck.com/blog/ducklake-architecture-deep-dive/"
  - title: "Delta Lake | MotherDuck Docs"
    url: "https://motherduck.com/docs/integrations/file-formats/delta-lake/"
  - title: "DuckLake | MotherDuck Docs"
    url: "https://motherduck.com/docs/concepts/ducklake/"
gated_asset:
  title: "DuckLake on MotherDuck"
  url: "https://motherduck.com/product/ducklake/"
---

# 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.

<glossary-callout guide="ducklake-lakehouse-table-format-book-full" />

## 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:

```sql
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.