В чем разница между Delta Format и Parquet?

Ответ

Apache Parquet — это открытый, колоночный формат хранения данных, оптимизированный для аналитических запросов (OLAP). Delta Lake — это слой над форматом хранения (чаще всего Parquet), который добавляет возможности транзакционного хранилища (ACID) и управления данными.

Ключевые отличия:

Характеристика Parquet (формат хранения) Delta Lake (открытый формат хранения + слой управления)
ACID-транзакции Нет. Запись поверх существующих файлов может привести к конфликтам и потере данных. Да. Гарантирует атомарность операций (INSERT, UPDATE, DELETE, MERGE) через журнал транзакций (Delta Log).
Изменение данных (Upsert/Delete) Не поддерживается нативно. Требуется перезапись всей партиции/таблицы. Поддерживаются операции MERGE INTO (upsert) и DELETE.
Версионирование (Time Travel) Нет. Да. Можно запросить данные на определенный момент времени (например, SELECT * FROM table VERSION AS OF 12).
Схема Поддерживает схему, но не обеспечивает ее соблюдение при записи ("schema on read"). Обеспечивает принудительное соблюдение схемы ("schema enforcement") и позволяет ее эволюционировать.
Управление метаданными Метаданные (схема, статистика) встроены в каждый файл. Метаданные централизованы в JSON-файлах Delta Log, что ускоряет чтение заголовков больших таблиц.

Пример работы с Delta в Spark:

# Чтение и запись в формате Delta (под капотом — Parquet + журнал)
df = spark.read.format("delta").load("/path/to/delta-table")

# ACID-транзакция: обновление данных
df.write.format("delta").mode("overwrite").save("/path/to/delta-table") # Безопасная перезапись

# Time Travel: чтение данных на прошлой неделе
df_old = spark.read.format("delta").option("versionAsOf", "5").load("/path/to/delta-table")

# Upsert с использованием MERGE
from delta.tables import *
deltaTable = DeltaTable.forPath(spark, "/path/to/delta-table")
deltaTable.alias("target").merge(
    updates_df.alias("source"),
    "target.id = source.id"
).whenMatchedUpdateAll().whenNotMatchedInsertAll().execute()

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

Ответ 18+ 🔞

Слушай, давай разжую, в чём тут разница, а то некоторые путают так, будто это одно и то же. Представь себе такую картину.

Apache Parquet — это, по сути, просто крутой и умный способ сложить твои данные на полку. Эффективно, компактно, читается быстро. Как аккуратно сложенное бельё в шкафу. Но если тебе надо вытащить одну конкретную пару носков (прочитать определённые колонки) или добавить новую стопку (дописать данные) — в принципе, ок. Но если ты захочешь выкинуть старые рваные трусы (удалить строки) или заменить одни носки на другие (обновить данные) — тут начинается ёперный театр. Тебе придётся выгребать весь шкаф, перебирать всё, что там есть, и складывать заново. Пиздец, да? Это и есть Parquet. Формат хранения, и всё.

А теперь Delta Lake — это не формат, это, блядь, целый продвинутый менеджер для твоего шкафа. Он берёт тот же самый Parquet (аккуратно сложенное бельё) и накрывает его медным тазом... то есть, нет — накрывает его умным журналом транзакций (Delta Log). И вот тут начинается магия.

В чём соль, а?

Что умеет? Parquet (просто шкаф) Delta Lake (шкаф с умным дворецким)
Транзакции (ACID) Нет. Пытаешься вдвоём что-то записать — получишь кашу и конфликт. Данные могут накрыться. Да, ёпта! Дворецкий (Delta Log) координирует, кто и когда пишет. Всё атомарно, как в нормальных базах.
Изменения (UPDATE/DELETE) Хуй с горы. Только полная перезапись таблицы, что долго и дорого. Запросто. MERGE INTO и DELETE работают, как родные. Дворецкий сам найдёт нужные файлы и аккуратно всё поменяет.
Машина времени (Time Travel) Не, не слышал. Записал поверх — прощай, старая версия. О, это шедевр! Спросишь "а что там было вчера в 15:00?" — и дворецкий достанет из журнала нужный снапшот. Версионирование на уровне.
Схема данных Есть схема, но она как бы "на прочтение". Можешь записать любую хуйню, а ошибка вылезет только когда будешь читать. Жёстко следит за схемой при записи. Хочешь добавить новую колонку? Можно, но через эволюцию схемы, а не абы как. Порядок, блядь.
Метаданные Вшиты в каждый файл. Когда файлов овердохуища, читать заголовки каждого — это пиздопроебибна по времени. Хранятся централизованно в том самом журнале (лёгкие JSON-файлы). Чтение метаданных для огромной таблицы — мгновенно.

Ну и как этим пользоваться-то?

Вот смотри, на Spark это выглядит просто и логично:

# Читаем Delta-таблицу (под капотом там Parquet, но + журнал)
df = spark.read.format("delta").load("/data/my_delta_table")

# Безопасная перезапись (ACID-транзакция, а не дикий overwrite)
df.write.format("delta").mode("overwrite").save("/data/my_delta_table")

# Машина времени, Карл! Прочитаем, как данные выглядели 5 версий назад.
df_old = spark.read.format("delta").option("versionAsOf", 5).load("/data/my_delta_table")

# Upsert (обновить или вставить) — то, за что Delta любят.
from delta.tables import *
deltaTable = DeltaTable.forPath(spark, "/data/my_delta_table")

deltaTable.alias("target").merge(
    new_data_df.alias("source"),
    "target.user_id = source.user_id"  # Связываем по ID
).whenMatchedUpdateAll().whenNotMatchedInsertAll().execute()

Итог, чувак: Parquet — это фундамент, отличный, быстрый формат для хранения. А Delta Lake — это целый этаж управления, который ставится поверх этого фундамента. Он превращает твоё озеро данных из свалки файлов в управляемое, надёжное хранилище, где есть транзакции, версии и нормальные операции с данными. Выбор, в общем-то, очевиден, если тебе не похуй на целостность своих данных.