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

«В чем разница между Delta Format и Parquet?» — вопрос из категории Apache Spark, который задают на 33% собеседований Data Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

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 как базовый формат, добавляя надежность и функциональность, характерную для корпоративных хранилищ данных.