Эволюция схемы (Schema Evolution) — это возможность изменять структуру таблицы (добавлять, удалять, изменять поля) без необходимости перезаписывать или полностью пересоздавать существующие данные.

Apache Iceberg предоставляет мощные и гибкие механизмы для управления изменениями схемы, что является одним из его главных преимуществ перед традиционными подходами в Data Lake.


📌 Какие операции Schema Evolution поддерживает Iceberg?

Iceberg позволяет проводить следующие изменения структуры таблиц:

  • Добавление новых колонок
  • Удаление существующих колонок
  • Переименование колонок
  • Изменение типа колонок (совместимые изменения типов данных)
  • Изменение порядка колонок

При этом не требуется переписывать старые данные, изменения применяются прозрачно и безопасно.


⚙️ Как Iceberg реализует Schema Evolution?

Iceberg хранит схему таблицы как часть метаданных snapshot’ов:

  • Каждое изменение схемы сохраняется в новых snapshot’ах.
  • Старые данные остаются неизменными, но при чтении Iceberg автоматически применяет текущую схему к существующим файлам данных.

Пример внутренней структуры метаданных:

Iceberg Table
├── Metadata
│   ├── Snapshot 1 (схема v1: id, name)
│   ├── Snapshot 2 (схема v2: id, name, email) <-- добавлено поле email
│   └── Snapshot 3 (схема v3: id, full_name, email) <-- name переименовано в full_name
│
└── Data Files
    ├── file1.parquet (схема v1)
    └── file2.parquet (схема v2)


🛠️ Примеры изменения схемы в Iceberg

🔹 Добавление новой колонки

SQL:

ALTER TABLE my_table ADD COLUMN email STRING;

Spark (API):

table.updateSchema()
     .addColumn("email", Types.StringType.get())
     .commit()

Эффект:
Новая колонка появляется во всех новых записях. При чтении старых данных поле будет возвращать null.


🔹 Удаление колонки

SQL:

ALTER TABLE my_table DROP COLUMN email;

Spark (API):

table.updateSchema()
     .deleteColumn("email")
     .commit()

Эффект:
Колонка удаляется из схемы. Старые данные не удаляются, но при чтении колонки больше нет.


🔹 Переименование колонки

SQL:

ALTER TABLE my_table RENAME COLUMN name TO full_name;

Spark (API):

table.updateSchema()
     .renameColumn("name", "full_name")
     .commit()

Эффект:
Название колонки изменено во всех snapshot’ах. Iceberg автоматически «видит» данные под новым именем.


🔹 Изменение типа данных колонки

SQL:

ALTER TABLE my_table ALTER COLUMN id TYPE BIGINT;

Spark (API):

table.updateSchema()
     .updateColumn("id", Types.LongType.get())
     .commit()

Эффект:
Тип колонки обновляется. Iceberg выполняет изменение типа «on-read», без переписывания старых данных.

⚠️ Важно:
Изменения типа должны быть совместимы (например, int → bigint).


🕑 Как Iceberg применяет Schema Evolution при чтении?

Iceberg автоматически адаптирует схему данных при чтении:

  • Если поле отсутствует в старом файле, оно заполняется null (добавленные колонки).
  • Удалённые колонки не возвращаются, даже если существуют в старых файлах.
  • Переименованные колонки прозрачно читаются с новым именем.
  • Изменение типа колонки происходит на лету.

Это называется Schema On-Read.


📊 Сравнение Schema Evolution в Iceberg и традиционном подходе

Операция с схемойIcebergТрадиционный Data Lake (например, Hive)
Добавление колонки✅ Легко и быстро (без переписывания)🔸 Сложно (часто требует переписывания)
Удаление колонки✅ Легко и безопасно🔸 Сложно (часто невозможно)
Переименование колонки✅ Поддерживается прозрачно🔸 Не поддерживается
Изменение типа данных✅ Поддерживаются совместимые изменения🔸 Очень сложно, требует rewrite

🎯 Преимущества Schema Evolution в Apache Iceberg

  • 🔥 Простота управления схемой: легко менять схему без остановки аналитических запросов.
  • Высокая скорость изменений: нет необходимости перезаписывать старые данные.
  • 🔄 Безопасность и надёжность: все изменения безопасны и легко откатываются через snapshot’ы.
  • 📦 Совместимость и гибкость: изменения применяются прозрачно для любых аналитических движков (Spark, Flink, Trino).

🚀 Итоговый вывод (кратко)

Iceberg решает проблему Schema Evolution в Data Lake с помощью мощных метаданных и автоматического применения схем при чтении данных (schema-on-read):

  • ✅ Легко добавлять, удалять и переименовывать колонки.
  • ✅ Не требуется переписывание существующих данных.
  • ✅ Полная совместимость с текущими аналитическими системами.