← Назад к вопросам

Из чего состоит Delta Format и какие преимущества он даёт?

1.7 Middle🔥 91 комментариев
#Apache Spark#Форматы данных и хранение

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI26 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Delta Format: Структура и Преимущества

Delta Lake — это формат хранения данных с открытым исходным кодом, разработанный компанией Databricks. Он решает критические проблемы больших данных, обеспечивая транзакционность, качество данных и производительность для аналитических операций.

Архитектура Delta Format

Delta состоит из трёх ключевых компонентов:

1. Данные (Parquet файлы)

Структурированные файлы Parquet хранят фактические данные с сжатием и оптимизацией для чтения по колонкам:

# Чтение Delta таблицы
df = spark.read.format("delta").load("/path/to/delta/table")

2. Transaction Log (_delta_log/)

Дневник транзакций отслеживает все изменения таблицы. Каждое изменение записывается как JSON файл с версией:

_delta_log/
├── 00000000000000000000.json  # версия 0
├── 00000000000000000001.json  # версия 1
├── 00000000000000000002.json  # версия 2
└── _last_checkpoint           # последняя контрольная точка

3. Метаданные (Schema)

Схема таблицы с информацией о типах данных, партициях и оптимизации.

Содержимое Transaction Log

Каждый JSON файл в _delta_log содержит:

  • add — добавление нового файла данных
  • remove — удаление файла (логическое удаление, файл сохраняется для MVCC)
  • metaData — обновление схемы или конфигурации
  • protocol — версия протокола Delta
  • commitInfo — метаданные коммита (timestamp, userId, операция)
{
  "add": {
    "path": "part-00000-abc.parquet",
    "size": 1024,
    "modificationTime": 1635874800000,
    "dataChange": true
  }
}

Преимущества Delta Format

1. ACID Транзакции

Дельта обеспечивает полную Atomicity, Consistency, Isolation, Durability на уровне хранилища:

# Безопасная параллельная запись
df1.write.format("delta").mode("append").save("/data/table")
df2.write.format("delta").mode("append").save("/data/table")
# Обе операции безопасны, конфликты разрешены автоматически

2. Time Travel (Версионирование)

Легко вернуться к любой версии данных:

# Чтение данных из версии 5
df = spark.read.format("delta").option("versionAsOf", 5).load("/data/table")

# Чтение данных на определённую дату
df = spark.read.format("delta").option("timestampAsOf", "2024-01-01").load("/data/table")

3. Схема Enforcement и Evolution

Автоматическая проверка схемы предотвращает ошибки:

# Попытка вставить данные с неправильной схемой — вызовет ошибку
df_wrong_schema.write.format("delta").mode("append").save("/data/table")

# Разрешить добавление новых колонок
df_new.write.format("delta").mode("append").option("mergeSchema", "true").save("/data/table")

4. Удаление Дуликатов (MERGE)

Оптимизированная операция объединения данных:

# Upsert с условием
target.alias("target").merge(
    source.alias("source"),
    "target.id = source.id"
).whenMatched().update(
    set={"name": col("source.name")}
).whenNotMatched().insert(
    values={"id": col("source.id"), "name": col("source.name")}
).execute()

5. Z-Ordering и Data Skipping

Автоматическое переупорядочивание данных для быстрого поиска:

# Оптимизация таблицы
spark.sql("OPTIMIZE /data/table ZORDER BY date, user_id")

6. Unified Batch и Streaming

Одна таблица для batch и streaming операций:

# Streaming запись
df.writeStream.format("delta").mode("append").start("/data/table")

7. Модная Совместимость

Полная совместимость с Apache Spark, интеграция с BI инструментами и озёрами данных.

Сравнение с альтернативами

ПараметрDeltaIcebergHudi
ACID
Time Travel
Z-Ordering
Схема Evolution
Простота✓✓✓✓✓

Практический пример: Построение Data Lake

# Bronze слой (сырые данные)
raw_data.write.format("delta").mode("overwrite").save("/bronze/events")

# Silver слой (очищенные данные)
df_bronze = spark.read.format("delta").load("/bronze/events")
df_silver = df_bronze.filter(col("timestamp").isNotNull()).dropDuplicates(["event_id"])
df_silver.write.format("delta").mode("overwrite").save("/silver/events")

# Gold слой (агрегированные данные)
df_silver.groupBy("user_id", "date").agg(count("*").alias("event_count")).write.format("delta").mode("overwrite").save("/gold/user_events")

Заключение

Delta Format — это de facto стандарт для enterprise data lakes. Его комбинация ACID гарантий, Time Travel, и оптимизаций делает его идеальным для критичных аналитических систем, где надёжность и производительность — приоритет.

Из чего состоит Delta Format и какие преимущества он даёт? | PrepBro