, Delta Lake и Hudi добавляют к папке с Parquet-файлами то, чего ей не хватало: снапшоты, транзакции и эволюцию схемы.
Ключевые тезисы
- — это список файлов на времени; отсюда бесплатный откат и запросы к прошлому.
- Транзакция сводится к атомарной подмене указателя на новый , данные при этом не переписываются.
- Обслуживание обязательно: без компактизации мелких файлов и удаления старых снапшотов формат деградирует.
Какую задачу решает
— это папка с Parquet-файлами в объектном хранилище. Дёшево и просто, пока не нужно ничего менять. Как только появляются обновления, удаления и одновременные читатели, папка перестаёт справляться: читатель видит половину записи, откатить неудачную загрузку нечем, схема меняется вручную.
Табличные форматы добавляют поверх файлов слой метаданных. Таблица перестаёт быть «всё, что лежит в папке» и становится явным списком файлов — снапшотом. Запись создаёт новый и атомарно подменяет указатель; читатель, начавший раньше, продолжает видеть старый и не ломается.
Из этого одного механизма вытекает всё остальное: транзакции, откат к любому прошлому состоянию, запросы к данным на вчерашний день, эволюция схемы без переписывания и одновременная работа , Trino и Flink с одной таблицей.
Ночной джоб залил в таблицу битые данные: поставщик поменял формат, и половина колонки поехала. На обычной папке с Parquet это авария на день — надо понять, какие файлы были дописаны, удалить их вручную, надеясь, что параллельно никто ничего не писал. С табличным форматом это одна команда: откатить таблицу к снапшоту, который был до загрузки. Файлы никуда не делись, менялся только указатель — операция мгновенная и атомарная. Отдельная польза: пока вы разбираетесь, читатели продолжают видеть последний хороший , а не полуразрушенную таблицу.
Подробный разбор
В обычном озере таблица — это «все файлы в каталоге». Читатель, начавший обход во время записи, увидит непредсказуемую смесь старых и новых файлов. В табличном формате таблица — это явный список файлов, , а текущий снапшот задан одним указателем.
- Писатель дописывает новые файлы данных — старые не трогает.
- Формирует новый : старый список плюс новые файлы минус удалённые.
- Атомарно подменяет указатель на новый .
Читатель, начавший до подмены, продолжает работать со старым снапшотом до конца запроса: все его файлы на месте. Начавший после — видит новый. Промежуточного состояния не существует ни для кого.
Атомарность подмены обеспечивается по-разному: опирается на условную запись в каталоге, Delta — на упорядоченный журнал транзакций. Смысл один: конфликт двух писателей обнаруживается и один из них повторяет попытку, а не портит таблицу.
Раз таблица — это указатель на список файлов, а старые файлы не удаляются сразу, прочитать прошлое состояние ничего не стоит: достаточно взять старый .
-- по идентификатору снапшота
SELECT * FROM sales VERSION AS OF 3821497;
-- по времени
SELECT * FROM sales TIMESTAMP AS OF '2026-08-01 00:00:00';
-- откат таблицы к снапшоту
CALL system.rollback_to_snapshot('sales', 3821497);Модель обучили в марте, в августе метрики разошлись, и непонятно — модель деградировала или данные изменились. Без снапшотов это неразрешимо: таблица давно другая. Со снапшотами достаточно обучить ту же модель на TIMESTAMP AS OF '2026-03-15' и сравнить. Отсюда практика: сохранять идентификатор снапшота в метаданных эксперимента рядом с хешем кода.
не хранит список файлов напрямую — это было бы неудобно при миллионах файлов. Между ними стоит два уровня: манифест-лист (список манифестов) и манифест (список файлов данных со статистиками).
| Уровень | Что содержит | Зачем |
|---|---|---|
| указатель на манифест-лист | атомарная единица версии | |
| манифест-лист | манифесты + границы партиций | отсечь целые манифесты |
| файлы + min/max по колонкам | отсечь отдельные файлы | |
| файл данных | собственно Parquet | читается только при необходимости |
Запрос WHERE date = '2026-08-01' не открывает ни одного файла данных, пока не спустится по иерархии и не найдёт манифесты, чьи границы включают эту дату. На таблице в миллион файлов это разница между секундой и десятью минутами.
- Компактизация: частые мелкие записи порождают тысячи файлов по несколько мегабайт. Чтение такой таблицы упирается в накладные расходы на открытие файлов.
- Истечение снапшотов: старые держат старые файлы. Без чистки хранилище растёт бесконечно.
- Удаление осиротевших файлов: упавшие джобы оставляют файлы, на которые не ссылается ни один .
- Переписывание манифестов: сами метаданные тоже фрагментируются.
Все четыре операции — отдельные регламентные задачи, а не автоматика. Типичная ошибка при внедрении: включить формат, обрадоваться транзакциям и через полгода обнаружить таблицу из двухсот тысяч файлов по 200 КБ, которая читается в двадцать раз медленнее исходной папки с Parquet.
Где применяется
- Обновления в озереUPDATE и DELETE там, где раньше был только дописываемый лог.
- Требования регуляторовУдаление данных конкретного пользователя из озера по запросу.
- Воспроизводимость обученияОбучить модель ровно на тех данных, что были в день эксперимента.
- Разделение хранения и вычисленийОдна таблица, несколько независимых движков.
Плюсы, минусы и альтернативы
Плюсы
- Транзакции и атомарность поверх обычного объектного хранилища.
- Откат и запросы к прошлому — бесплатное следствие снапшотов.
- Схема меняется без переписывания данных.
- Статистики в манифестах отсекают файлы до чтения — запросы ускоряются в разы.
Минусы
- Требует регулярного обслуживания: компактизация и удаление старых снапшотов.
- Мелкие частые записи порождают лавину файлов и метаданных.
- Одновременная запись в одну таблицу упирается в конфликты на подмене указателя.
- Три конкурирующих формата, и переносимость между ними неполная.
Брать, если
- В озере нужны обновления, удаления или откаты.
- С одними данными работает несколько движков.
Не брать, если
- Данные только дописываются и никогда не меняются — обычного Parquet достаточно.
- Объём мал: колоночная СУБД проще в эксплуатации.
Чем заменяют
Видеолекции
Записи университетских курсов, где эта тема звучит. Ссылка открывает запись с той секунды, где о ней говорят, — искать по трёхчасовой лекции не нужно.
Всё, что названо в описании, разобрано здесь же или в соседней теме — переходы под каждым определением.
Снапшот
Список файлов на времени. Таблица — это указатель на текущий .
Разбор ниже: Снапшот и атомарная подменаАтомарная подмена
Транзакция сводится к смене одного указателя, данные не переписываются.
Разбор ниже: Снапшот и атомарная подменаПутешествие во времени
Запрос к состоянию таблицы на прошлую дату — просто чтение старого снапшота.
Разбор ниже: Путешествие во времениМанифест
Файл со списком файлов данных и их статистиками. Позволяет отсечь лишнее до чтения.
Разбор ниже: Метаданные и отсечение файловКомпактизация
Слияние мелких файлов в крупные. Без неё формат постепенно деградирует.
Разбор ниже: ОбслуживаниеСпрашивают на собеседовании: Arenadata — Платформа данных.
Тема встречается в тесте по направлениям — ошибки приведут обратно на эту страницу.
Глава «Инженерия данных» последний раз правилась . Нашли ошибку — напишите.