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