Apache Iceberg 1.12.0 — Variant и геоданные

Apache Iceberg 1.12.0 — Variant и геоданные

 

Apache Iceberg 1.12.0 вышел после 777 коммитов от 142 участников. Релиз добавляет заметные улучшения в работу с Variant, геопространственными типами и потоковой обработкой удалений. Инженерам стоит оценить обновление, если в проектах уже используются semi-structured данные или планируется переход на формат версии 3. Iceberg представляет собой табличный формат для озер данных, который обеспечивает ACID-транзакции, эволюцию схем и эффективное управление большими наборами. Обновление затрагивает ключевые аспекты производительности и совместимости, поэтому решение о миграции требует анализа текущего стека инструментов и типов обрабатываемых данных.

 

Улучшения Variant

Вариант теперь читается быстрее в Spark 4.0 и 4.1: несегментированные данные Variant идут через векторизованный путь Parquet вместо построчной обработки. Variant позволяет хранить semi-structured данные, то есть информацию с переменной структурой, похожую на JSON, внутри строго типизированных таблиц. Векторизованное чтение ускоряет обработку за счет пакетной работы с данными, что особенно важно при сканировании больших объемов. Сегментация стала строже — поле разбивается на типизированные колонки только при полном совпадении семейства типов после расширения чисел. Это исключает ситуации, когда колонка покрывала лишь часть строк, и снижает риск ошибок при запросах.

Запись сегментированного Variant вышла за пределы Spark. Flink, Kafka Connect sink и generic record writer теперь тоже умеют создавать такие данные. В результате semi-structured потоки из этих инструментов сразу получают преимущества при чтении. Дополнительно исправили вычисление границ строк в UTF-8, обработку больших decimal и сериализацию классов Variant. Эти исправления повышают надежность при работе с текстовыми и числовыми полями переменной длины.

Ограничения остаются: ORC-фильтры с Variant работают нестабильно, а malformed binary может привести к ошибкам парсинга. Перед обновлением стоит проверить, сколько данных уже хранится в Variant и как часто они читаются. Если объем semi-structured данных велик и чтение происходит регулярно, переход оправдан. При редком использовании Variant или наличии ORC-таблиц преимущества могут оказаться минимальными, и миграцию лучше отложить.

 

Поддержка геопространственных типов

Geometry и geography теперь читаются и пишутся в Avro и Parquet. Geometry описывает объекты на плоскости, а geography учитывает кривизну Земли, что важно для точных расчетов расстояний и площадей. В Parquet они отображаются на логические типы geometry и geography, поэтому файлы становятся самодостаточными и не требуют внешних метаданных для интерпретации. Spark 4.1 получил полный цикл работы с этими типами, включая row-level DELETE, UPDATE и MERGE, а также merge-on-read через deletion vectors на формате версии 3. Deletion vectors позволяют маркировать удаленные строки без перезаписи файлов, что ускоряет операции в потоковых сценариях.

Остальные движки пока ограничены. Spark 3.5 и 4.0, Flink и ORC не поддерживают запись и чтение. Чтение идёт только через row-based reader, векторизованного пути на Arrow нет, а пространственные предикаты отсутствуют. Фильтры можно строить только по обычным колонкам. В российских проектах на Spark 3.x или Flink 1.19 и ниже эти возможности останутся недоступными даже после обновления Iceberg. Командам, которые не используют Spark 4.1, стоит отложить миграцию до появления поддержки в нужных версиях. Если геоданные не входят в текущие задачи, обновление не принесет практической пользы и может усложнить поддержку.

 

Преобразование equality deletes

Streaming-пайплайны часто пишут equality deletes, которые дешевы при записи, но требуют повторного сканирования файлов при каждом запросе. Equality deletes удаляют строки путем сравнения значений, что приводит к дополнительным затратам на CPU при чтении. Новая задача ConvertEqualityDeletes в Flink переводит такие удаления в deletion vectors один раз и фиксирует результат вместе с файлами данных. Deletion vectors хранят позиции удаленных строк, позволяя пропускать их без повторных сравнений.

После преобразования запросы работают с позиционными удалениями вместо сравнения значений. Функция требует формат версии 3 и работает на Flink 1.20-2.3. Она интегрируется с IcebergSink и позволяет разделять staging и целевую ветку. В контурах с активными upsert-потоками это снижает нагрузку на чтение. Однако переход на формат 3 требует проверки совместимости существующих инструментов и планирования downtime при конвертации таблиц. Если в проекте преобладают batch-запросы без частых upsert, выгода от преобразования будет небольшой.

 

Другие изменения и практические выводы

Hilbert-кластеризация появилась в rewrite_data_files для Spark 4.1. Она даёт более плотную группировку, чем Z-order, при многомерных фильтрах, что улучшает pruning файлов при запросах с несколькими условиями. REST-каталог получил поддержку VariantType, endpoint для unregister таблицы и формализацию remote signing. Эти изменения упрощают управление каталогами и интеграцию с внешними системами авторизации.

Обновление имеет смысл, если проект уже на Spark 4.1 или Flink 1.20+ и активно использует Variant либо планирует geospatial. В остальных случаях основные преимущества останутся недоступны. При оценке стоит учитывать объем данных, частоту чтения Variant и геотипов, а также готовность к формату версии 3. Полный список изменений доступен в release notes.

 

Источник

Это краткий разбор материала Apache Iceberg. Полная версия с примерами кода, схемами и деталями реализации — в оригинале: Apache Iceberg 1.12.0 — Variant и геоданные.

Курс по теме — Каталог курсов Школы Больших Данных

 

Apache Kafka для инженеров данных

Код курса
DEVKI
Ближайшая дата курса
7 декабря, 2026
Продолжительность
24 ак.часов
Стоимость обучения
76 800