Инженерия данных

Open Table Formats

Табличные форматы озера

новинкаСтандарт последних лет: заменил Hive-таблицы почти везде, где есть озеро данных.

Направления: Инженерия ИИ · Инженерия данных

, Delta Lake и Hudi добавляют к папке с Parquet-файлами то, чего ей не хватало: снапшоты, транзакции и эволюцию схемы.

Ключевые тезисы

  • — это список файлов на времени; отсюда бесплатный откат и запросы к прошлому.
  • Транзакция сводится к атомарной подмене указателя на новый , данные при этом не переписываются.
  • Обслуживание обязательно: без компактизации мелких файлов и удаления старых снапшотов формат деградирует.

Какую задачу решает

— это папка с Parquet-файлами в объектном хранилище. Дёшево и просто, пока не нужно ничего менять. Как только появляются обновления, удаления и одновременные читатели, папка перестаёт справляться: читатель видит половину записи, откатить неудачную загрузку нечем, схема меняется вручную.

Табличные форматы добавляют поверх файлов слой метаданных. Таблица перестаёт быть «всё, что лежит в папке» и становится явным списком файлов — снапшотом. Запись создаёт новый и атомарно подменяет указатель; читатель, начавший раньше, продолжает видеть старый и не ломается.

Из этого одного механизма вытекает всё остальное: транзакции, откат к любому прошлому состоянию, запросы к данным на вчерашний день, эволюция схемы без переписывания и одновременная работа , Trino и Flink с одной таблицей.

Откат неудачной загрузки за одну команду

Ночной джоб залил в таблицу битые данные: поставщик поменял формат, и половина колонки поехала. На обычной папке с Parquet это авария на день — надо понять, какие файлы были дописаны, удалить их вручную, надеясь, что параллельно никто ничего не писал. С табличным форматом это одна команда: откатить таблицу к снапшоту, который был до загрузки. Файлы никуда не делись, менялся только указатель — операция мгновенная и атомарная. Отдельная польза: пока вы разбираетесь, читатели продолжают видеть последний хороший , а не полуразрушенную таблицу.

Подробный разбор

4 подтемы — объяснения, формулы, примеры и интерактивные графики.

В обычном озере таблица — это «все файлы в каталоге». Читатель, начавший обход во время записи, увидит непредсказуемую смесь старых и новых файлов. В табличном формате таблица — это явный список файлов, , а текущий снапшот задан одним указателем.

  1. Писатель дописывает новые файлы данных — старые не трогает.
  2. Формирует новый : старый список плюс новые файлы минус удалённые.
  3. Атомарно подменяет указатель на новый .

Читатель, начавший до подмены, продолжает работать со старым снапшотом до конца запроса: все его файлы на месте. Начавший после — видит новый. Промежуточного состояния не существует ни для кого.

На практике

Атомарность подмены обеспечивается по-разному: опирается на условную запись в каталоге, 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Платформа данных.

Проверить себя

Тема встречается в тесте по направлениям — ошибки приведут обратно на эту страницу.

Следующий шагПроверить себя: SQL и инженерия данныхТема встречается в этом тесте 1 раз. Ошибка приведёт обратно на эту страницу — с объяснением, что именно не сошлось.Перейти →

Глава «Инженерия данных» последний раз правилась . Нашли ошибку — напишите.