Добавить в корзинуПозвонить
Найти в Дзене
INZHENERKA.TECH

DuckLake

Чтобы поправить одну строку в parquet, обычно приходится переписывать файл целиком. В 2026 году это всё ещё повседневность большинства озёр данных: сам по себе parquet не умеет ни UPDATE, ни ROLLBACK, а пайплайн, упавший на середине записи, может оставить в озере недописанные файлы и несогласованное состояние. Поэтому появились Iceberg и Delta Lake. Они добавляют поверх parquet транзакционный слой, но за это платишь: метаданные размазаны по множеству служебных файлов на S3, и в эксплуатации часто появляется ещё и отдельный каталог, за которым нужно следить. Команда DuckDB предложила другой путь и выпустила DuckLake. Данные так и лежат в parquet, а все метаданные живут в обычной реляционной базе, хоть в SQLite, хоть в PostgreSQL. Подключается всё одной командой ATTACH: INSTALL ducklake; ATTACH 'ducklake:sqlite:metadata.sqlite' AS lake (DATA_PATH 'data/'); Каждая закоммиченная транзакция создаёт снапшот, поэтому из коробки получаешь UPDATE, MERGE, ACID и time travel. Даже после DELET

DuckLake

Чтобы поправить одну строку в parquet, обычно приходится переписывать файл целиком. В 2026 году это всё ещё повседневность большинства озёр данных: сам по себе parquet не умеет ни UPDATE, ни ROLLBACK, а пайплайн, упавший на середине записи, может оставить в озере недописанные файлы и несогласованное состояние.

Поэтому появились Iceberg и Delta Lake. Они добавляют поверх parquet транзакционный слой, но за это платишь: метаданные размазаны по множеству служебных файлов на S3, и в эксплуатации часто появляется ещё и отдельный каталог, за которым нужно следить.

Команда DuckDB предложила другой путь и выпустила DuckLake. Данные так и лежат в parquet, а все метаданные живут в обычной реляционной базе, хоть в SQLite, хоть в PostgreSQL. Подключается всё одной командой ATTACH:

INSTALL ducklake;

ATTACH 'ducklake:sqlite:metadata.sqlite' AS lake (DATA_PATH 'data/');

Каждая закоммиченная транзакция создаёт снапшот, поэтому из коробки получаешь UPDATE, MERGE, ACID и time travel. Даже после DELETE без WHERE данные возвращаются одним запросом к прошлой версии таблицы:

SELECT * FROM my_table AT (VERSION => 5);

Вместо номера версии можно указать время, AT (TIMESTAMP => '2026-03-24 23:08:34'), DuckLake сам найдёт подходящий снапшот.

Формат молодой, первая стабильная версия вышла весной 2026, и в крупных продакшен-озёрах чаще выбирают более зрелый и широко поддерживаемый Iceberg. Но если пайплайн уже построен на DuckDB и parquet, DuckLake добавляет транзакции и версионирование почти без переделок.

Cпецификация и документация лежат на ducklake.select.