Apache Iceberg. Типы данных и эволюция схемы
Эволюция схемы без боли
Содержание
Типы данных и эволюция схемы
Эволюция схемы в Iceberg — одна из тех функций, после знакомства с которыми вы удивитесь, как вообще жили без неё.
Представьте сценарий: маркетологам нужно переименовать колонку. В старом мире это означало согласование простоя, координацию между командами, перезагрузку таблицы, обновление всех запросов и прочие радости. Ужас.
А если нужно удалить колонку? Внезапно вы сталкиваетесь со сдвигами позиций, сломанными запросами, костылями. Iceberg решает эти проблемы элегантно.
Типы данных в Iceberg
Прежде чем говорить об эволюции схемы, давайте посмотрим, какие типы данных вообще есть в Iceberg.
Базовые типы
Обычные подозреваемые: boolean, int, long, float, double, decimal, string, binary. Есть timestamp (без временной зоны) и timestamp with time zone. А ещё структуры, списки и карты — комплексные типы для моделирования сложных доменных объектов.
Новинки версии 3
Iceberg версии 3 принёс три важных дополнения:
Variant — тип для полуструктурированных данных (например, JSON‑колонка). Раньше у вас было два плохих варианта: расплющить всё в широкую таблицу с кучей
NULLили хранить как строку, жертвуя производительностью запросов.Variantкодирует вложенные данные в эффективный бинарный формат, сохраняя гибкость схемы и позволяя движку push‑down фильтры.Нативные геопространственные типы (
geometry,geography) — для работы с полигонами, точками, линиями. Если вы не работаете с гео‑данными, можете пропустить. Если работаете — это огромное облегчение: больше никаких костыльных преобразований структур.Таймстампы с наносекундной точностью — для высокочастотных событийных данных (телеметрия, устройства с GPS). Теперь можно хранить время события с точностью до наносекунды прямо в таблице.
Эти типы — не просто «приятные плюшки». Они открывают целые классы use‑cases, которые раньше были слишком сложны для реализации в data lake.
Безопасные изменения схемы
Iceberg покрывает базовые типы, но что происходит, когда схема должна измениться? Мир меняется, бизнес адаптируется — колонки переименовываются, появляются новые поля, старые исчезают, типы данных расширяются.
Поддерживаемые виды эволюции схемы в Iceberg:
- Добавление колонок
- Удаление колонок
- Переименование колонок
- Расширение типов (widening)
- Изменение порядка колонок (для читаемости)
- Эволюция комплексных типов (структур, массивов, карт)
Все эти изменения мгновенны — это всего лишь изменения метаданных. Ни один файл данных не перезаписывается.
Магия column ID
Iceberg отслеживает каждую колонку по уникальному ID, а не по позиции или имени. Это делает изменения схемы безопасными:
- Если вы удаляете колонку, ничего никуда не сдвигается.
- Если переименовываете колонку, старые файлы данных по‑прежнему читаются корректно, потому что они ссылаются на ID колонки. Вы меняете лишь метаданные — имя, соответствующее этому ID.
В результате все старые файлы данных остаются читаемыми с новой схемой. Обратная совместимость встроена на уровне базы.
Конечно, на уровне приложений что‑то может сломаться — но база данных безопасна.
Пример: таблица user events
У нас есть базовая таблица user_events с тремя колонками: event_id, user_id, event_type. Несколько недель спустя маркетинг хочет отслеживать тип устройства и версию браузера.
Добавляем колонки:
alter table user_events add colums ( device_type STRING, browser_version STRING);
Новые записи приходят с этими колонками, старые записи получают null для новых полей. Всё работает.
Ещё через некоторое время маркетинг понимает, что browser_version не очень полезен. Удаляем колонку:
alter table user_events drop column browser_version;
Колонка исчезает из запросов, но данные остаются в хранилище. Вы можете откатиться во времени (time travel) к снапшоту, где колонка ещё существовала, и увидеть её.
Переименование колонки
Кто‑то решает, что event_type недостаточно описательно, и хочет переименовать его в action_category:
alter table user_events rename column event_type to action_category;
Ни один файл данных не тронут — только метаданные. Исторические данные остаются доступными, запросы работают.
Важный нюанс: Iceberg не координирует rollout. После переименования все запросы должны использовать новое имя сразу. Нет «периода благодати», когда работают оба имени. Вам всё равно нужно согласовать изменение с приложениями, дашбордами, ETL‑пайплайнами.
Расширение типов (widening)
Допустим, user_id был определён как INT, а теперь у вас больше 4,2 миллиарда пользователей (поздравляем!). Вы можете расширить тип до BIGINT:
alter table user_events alter column user_id type BIGINT;
Старые данные остаются на диске как 32‑битные целые, но при чтении Iceberg автоматически приводит их к более широкому типу. Безопасное расширение работает для INT → BIGINT, FLOAT → DOUBLE, увеличения точности DECIMAL.
Изменение порядка колонок
Если describe table и select * становятся неудобными из‑за накопившихся изменений схемы, вы можете переупорядочить колонки:
alter table user_events alter column action_category after event_id;
Это тоже всего лишь изменение метаданных — файлы данных не затрагиваются.
Эволюция комплексных типов
Допустим, у вас есть структура user_preferences с полями email_notifications и color_theme. Позже вы хотите добавить mobile_notifications и language_preference. Синтаксис зависит от движка, но на уровне API Iceberg это поддерживается:
alter table user_eventsadd column user_preferences.mobile_notifications BOOLEAN,add column user_preferences.language_preference STRING;
Существующие данные получат null для новых полей — всё продолжает работать.
Дисциплина и руководство (governance)
Гибкость требует дисциплины. Изменения схемы настолько просты на уровне базы, что остальную систему легко испортить.
- Тестируйте изменения перед rollout.
- Координируйтесь с командами, которые используют таблицу.
- Обновляйте пайплайны, дашборды, приложения.
Iceberg берёт на себя техническую сложность на уровне данных — вы берёте на себя руководство. Сделайте это правильно, и эволюция схемы станет одним из ваших самых мощных инструментов.
Схема — как живой организм. Она растёт, меняется, иногда теряет лишнее. Iceberg — это система контроля версий для вашей схемы, которая гарантирует, что ни одно изменение не убьёт историю.
Что дальше? Практикуемся! В следующем упражнении Эволюция схемы на практике вы примените все изученные операции к реальной таблице.