Перейти к основному содержанию
Предоставляет доступный только для чтения интерфейс, подобный таблице, для таблиц Apache Iceberg, хранящихся в Amazon S3, Azure, HDFS или локально.

Синтаксис

Аргументы

Описание этих аргументов соответствует описанию аргументов в табличных функциях s3, azureBlobStorage, HDFS и file соответственно. format указывает формат файлов данных в таблице Iceberg. Для icebergS3 можно использовать необязательный параметр extra_credentials, чтобы передать role_arn для ролевого доступа в ClickHouse Cloud. Шаги по настройке см. в разделе Secure S3.

Возвращаемое значение

Таблица с указанной структурой для чтения данных из указанной таблицы Iceberg.

Пример

В настоящее время ClickHouse поддерживает чтение формата Iceberg версий v1 и v2 через табличные функции icebergS3, icebergAzure, icebergHDFS и icebergLocal, а также через движки таблиц IcebergS3, icebergAzure, IcebergHDFS и IcebergLocal.

Определение именованной коллекции

Ниже приведен пример настройки именованной коллекции для хранения URL-адреса и учетных данных:

Использование каталога данных

Таблицы Iceberg также можно использовать с различными каталогами данных, такими как REST Catalog, AWS Glue Data Catalog и Unity Catalog.
При использовании каталога большинству пользователей стоит использовать движок базы данных DataLakeCatalog, который подключает ClickHouse к вашему каталогу и позволяет обнаруживать таблицы. Этот движок базы данных можно использовать вместо ручного создания отдельных таблиц с помощью движка таблицы IcebergS3.
Чтобы использовать каталог, создайте таблицу с движком IcebergS3 и укажите необходимые настройки. Например, REST Catalog с хранилищем MinIO:
Или, используя каталог данных AWS Glue с S3:

Эволюция схемы

На данный момент с помощью CH можно читать таблицы Iceberg, схема которых со временем менялась. Сейчас поддерживается чтение таблиц, в которых столбцы добавлялись и удалялись, а также менялся их порядок. Также можно изменить столбец с обязательным значением на столбец, в котором допускается NULL. Кроме того, поддерживается допустимое приведение для простых типов, а именно:  
  • int -> long
  • float -> double
  • decimal(P, S) -> decimal(P’, S) where P’ > P.
В настоящее время нельзя изменять вложенные структуры или типы элементов внутри Array и Map.

Отсечение партиций

ClickHouse поддерживает отсечение партиций при выполнении запросов SELECT к таблицам Iceberg, что позволяет повысить производительность запросов за счет пропуска нерелевантных файлов данных. Чтобы включить отсечение партиций, задайте use_iceberg_partition_pruning = 1. Дополнительные сведения об отсечении партиций в Iceberg см. по адресу: https://iceberg.apache.org/spec/#partitioning

Путешествие во времени

ClickHouse поддерживает путешествие во времени для таблиц Iceberg, что позволяет выполнять запросы к историческим данным по определённой временной метке или идентификатору снимка.

Обработка таблиц с удалёнными строками

В настоящее время поддерживаются только таблицы Iceberg с position deletes. Следующие методы удаления не поддерживаются:

Базовое использование

Примечание: В одном запросе нельзя одновременно указывать параметры iceberg_timestamp_ms и iceberg_snapshot_id.

Важные моменты

  • Снимки обычно создаются в следующих случаях:
  • В таблицу записываются новые данные
  • Выполняется компакция данных
  • Изменения схемы обычно не создают снимков — это приводит к важным особенностям при использовании путешествия во времени с таблицами, схема которых менялась.

Примеры сценариев

Все сценарии приведены для Spark, поскольку CH пока не поддерживает запись в таблицы Iceberg.

Сценарий 1: Изменения схемы без новых снимков

Рассмотрим следующую последовательность операций:
Результаты запросов для разных временных меток:
  • В ts1 & ts2: отображаются только два исходных столбца
  • В ts3: отображаются все три столбца, при этом в поле цены для первой строки указано NULL

Сценарий 2: Различия между исторической и текущей схемами

Запрос путешествия во времени для текущего момента может возвращать схему, отличающуюся от текущей схемы таблицы:
Это происходит потому, что ALTER TABLE не создает нового снимка, а для текущей таблицы Spark берет значение schema_id из последнего файла метаданных, а не из снимка.

Сценарий 3: Различия между исторической и текущей схемой

Второй момент: при использовании путешествия во времени невозможно получить состояние таблицы на момент, когда в неё ещё не было записано никаких данных:
В ClickHouse поведение такое же, как в Spark. Можете мысленно заменить запросы SELECT в Spark на запросы SELECT в ClickHouse, и всё будет работать так же.

Определение файла metadata.json

При использовании табличной функции iceberg в ClickHouse системе необходимо найти правильный файл metadata.json, который описывает структуру таблицы Iceberg. Ниже описано, как происходит этот поиск:
  1. Явное указание пути: *Если задан iceberg_metadata_file_path, система использует этот точный путь, объединяя его с путем к каталогу таблицы Iceberg.
  • Если задан этот параметр, все остальные параметры разрешения игнорируются.
  1. Сопоставление UUID таблицы: *Если указан iceberg_metadata_table_uuid, система: *Просматривает только файлы .metadata.json в каталоге metadata *Отбирает файлы, содержащие поле table-uuid, которое соответствует указанному UUID (регистронезависимо)
  2. Поиск по умолчанию: *Если ни один из указанных выше параметров не задан, кандидатами считаются все файлы .metadata.json в каталоге metadata

Выбор самого нового файла

После того как по приведённым выше правилам определены файлы-кандидаты, система выбирает самый новый из них:
  • Если iceberg_recent_metadata_file_by_last_updated_ms_field включён:
  • Выбирается файл с наибольшим значением last-updated-ms
  • В противном случае:
  • Выбирается файл с наибольшим номером версии
  • (Версия обозначается как V в именах файлов формата V.metadata.json или V-uuid.metadata.json)
Примечание: Все упомянутые настройки относятся к настройкам табличной функции (а не к глобальным настройкам или настройкам уровня запроса) и должны быть указаны, как показано ниже:
Примечание: Хотя за разрешение метаданных обычно отвечают каталоги Iceberg, табличная функция iceberg в ClickHouse напрямую интерпретирует файлы, хранящиеся в S3, как таблицы Iceberg, поэтому важно понимать эти правила разрешения.

Кэш метаданных

Движок таблицы Iceberg и табличная функция поддерживают кэш метаданных, в котором хранится информация о файлах манифеста, списке манифестов и metadata json. Кэш хранится в памяти. Эта возможность управляется настройкой use_iceberg_metadata_files_cache, которая включена по умолчанию.

Псевдонимы

Табличная функция iceberg теперь — псевдоним icebergS3.

Виртуальные столбцы

  • _path — Путь к файлу. Тип: LowCardinality(String).
  • _file — Имя файла. Тип: LowCardinality(String).
  • _size — Размер файла в байтах. Тип: Nullable(UInt64). Если размер файла неизвестен, значение — NULL.
  • _time — Время последнего изменения файла. Тип: Nullable(DateTime). Если время неизвестно, значение — NULL.
  • _etag — ETag файла. Тип: LowCardinality(String). Если ETag неизвестен, значение — NULL.

Запись в таблицу Iceberg

Начиная с версии 25.7, ClickHouse поддерживает изменение таблиц Iceberg пользователя. Сейчас это экспериментальная возможность, поэтому сначала её нужно включить:

Создание таблицы

Чтобы создать собственную пустую таблицу Iceberg, используйте те же команды, что и для чтения, но явно задайте схему. Операции записи поддерживают все форматы данных из спецификации Iceberg, такие как Parquet, Avro и ORC.

Пример

Примечание: Чтобы создать файл указания версии, включите настройку iceberg_use_version_hint. Если вы хотите сжать файл metadata.json, укажите имя кодека в настройке iceberg_metadata_compression_method.

INSERT

После создания новой таблицы вы можете вставлять данные, используя обычный синтаксис ClickHouse.

Пример

DELETE

ClickHouse также поддерживает удаление лишних строк в формате merge-on-read. Этот запрос создаст новый снимок с файлами позиционного удаления.

Пример

Эволюция схемы

ClickHouse позволяет добавлять, удалять, изменять или переименовывать столбцы простых типов (не Tuple, не Array и не Map).

Пример

Компакция

ClickHouse поддерживает компакцию таблиц Iceberg. Сейчас можно объединять файлы позиционного удаления с файлами данных с одновременным обновлением метаданных. Идентификаторы предыдущих снимков и временные метки остаются без изменений, поэтому функцию путешествия во времени по-прежнему можно использовать с теми же значениями. Как это использовать:

Удаление устаревших снимков

В таблицах Iceberg после каждой операции INSERT, DELETE или UPDATE накапливаются новые снимки. Со временем это может привести к большому количеству снимков и связанных с ними файлов данных. Команда expire_snapshots удаляет старые снимки и очищает файлы данных, на которые больше не ссылается ни один сохранённый снимок. Синтаксис:
По умолчанию то, какие снимки сохранять, определяется политикой хранения (свойствами таблицы min-snapshots-to-keep, max-snapshot-age-ms и переопределениями для отдельных ссылок). Если указан snapshot_ids, политика хранения не применяется, и на истечение рассматриваются только перечисленные снимки. Аргументы:
  • 'timestamp' (позиционный) или expire_before = 'timestamp' — строка даты и времени (например, '2024-06-01 00:00:00'), интерпретируемая в часовом поясе сервера. Служит своего рода предохранителем: снимки, у которых timestamp-ms равен этому значению или больше него, защищены от истечения, даже если по политике хранения они иначе подлежали бы удалению. Можно использовать вместе с snapshot_ids; в этом случае перечисленные снимки с этой временной меткой или новее не истекают.
  • retention_period = '<duration>' — переопределяет значение history.expire.max-snapshot-age-ms на уровне таблицы только для этого вызова. Снимки старше этого периода (отсчитываемого от текущего момента) становятся кандидатами на истечение. Значение представляет собой строку длительности, состоящую из одной или нескольких записанных подряд пар {number}{unit}. Поддерживаемые единицы: y (365 дней), w (7 дней), d (24 часа), h (60 минут), m (60 секунд), s (1 секунда), ms (1 миллисекунда). Единицы можно комбинировать, например: '3d', '12h', '1d12h30m', '500ms'.
  • retain_last = N — переопределяет значение history.expire.min-snapshots-to-keep на уровне таблицы только для этого вызова. Независимо от возраста всегда сохраняется не менее N снимков.
  • snapshot_ids = [id1, id2, ...] — помечает на истечение только перечисленные идентификаторы снимков (кроме снимков, на которые ссылаются текущий снимок, ветви или теги). Этот режим полностью отключает политику хранения и не может использоваться вместе с retention_period или retain_last.
  • dry_run = 1 — вычисляет, что было бы помечено на истечение, и возвращает Метрика без записи новых метаданных и удаления файлов.
retention_period и retain_last переопределяют только значения хранения по умолчанию на уровне таблицы. Переопределения хранения для отдельных ссылок (ветвей/тегов), настроенные в свойствах таблицы Iceberg (например, refs.<branch>.min-snapshots-to-keep), никогда не переопределяются — они всегда применяются в соответствии с метаданными таблицы.
Пример:
Вывод: Команда возвращает таблицу с двумя столбцами (metric_name String, metric_value Int64); для каждой метрики выводится одна строка. Имена метрик соответствуют спецификации Iceberg: Команда выполняет следующие шаги:
  1. Оценивает политику хранения (см. ниже), чтобы определить, какие снимки нужно сохранить
  2. Если указан аргумент временной метки, дополнительно защищает все снимки с этой временной меткой и новее
  3. Удаляет снимки, которые не сохраняются политикой и не защищены временной меткой
  4. Определяет, какие файлы связаны исключительно с удалёнными снимками
  5. В обычном режиме: создаёт новые метаданные без удалённых снимков
  6. В обычном режиме: физически удаляет недостижимые списки манифестов, файлы манифестов и файлы данных
  7. В режиме dry_run = 1: пропускает шаги 5 и 6 и возвращает только вычисленные метрики

Политика хранения снимков

Команда expire_snapshots учитывает политику хранения снимков Iceberg. Параметры хранения задаются через свойства таблицы Iceberg и переопределения для отдельных ссылок: Каждая ссылка на снимок (refs в метаданных Iceberg) может переопределять эти значения с помощью полей для конкретной ссылки: min-snapshots-to-keep, max-snapshot-age-ms и max-ref-age-ms. Оценка хранения:
  • Для каждой ветки (включая main): обход цепочки предков начинается с вершины ветки. Снимки сохраняются, пока выполняется хотя бы одно из следующих условий:
    • Снимок входит в число первых min-snapshots-to-keep в цепочке
    • Возраст снимка не превышает max-snapshot-age-ms (то есть now - timestamp-ms <= max-snapshot-age-ms)
  • Для тегов: помеченный снимок сохраняется, если только возраст тега не превысил max-ref-age-ms; в этом случае ссылка на тег удаляется
  • Ссылки, кроме main, возраст которых превышает max-ref-age-ms, удаляются полностью (ветка main не удаляется никогда)
  • Висячие ссылки, указывающие на несуществующие снимки, удаляются с предупреждением
  • Текущий снимок сохраняется всегда независимо от настроек хранения
Требуемые привилегии: Требуется привилегия ALTER TABLE EXECUTE, которая является дочерней по отношению к ALTER TABLE в иерархии управления доступом ClickHouse. Её можно выдать отдельно или через родительскую привилегию:
  • Поддерживаются только таблицы формата Iceberg version 2 (снимки v1 не гарантируют наличие manifest-list, который необходим для безопасного определения файлов для очистки)
  • Текущий снимок всегда сохраняется, даже если он старше указанной временной метки
  • Требуется, чтобы параметр allow_insert_into_iceberg был включен
  • Требуется, чтобы параметр allow_experimental_expire_snapshots был включен
  • Собственные механизмы авторизации каталога (аутентификация REST-каталога, AWS Glue IAM и т. д.) действуют независимо при обновлении метаданных в ClickHouse

Удаление осиротевших файлов

Осиротевшие файлы — это файлы в хранилище, на которые не ссылается ни один снимок в метаданных таблицы Iceberg. Они накапливаются из-за неудачных попыток записи, частичной очистки после компакции и прерванных операций, что приводит к неограниченному росту объема хранилища. Команда remove_orphan_files обнаруживает и удаляет эти осиротевшие файлы. Синтаксис:
Параметры: Примеры:
Вывод: Команда возвращает таблицу со столбцами metric_name и metric_value, в которой показано количество удалённых файлов (или файлов, которые были бы удалены в режиме dry_run) по категориям. Категории файлов определяются с помощью эвристик на основе соглашений об именовании файлов; файлы, не соответствующие ни одному конкретному шаблону регулярного выражения, по умолчанию относятся к deleted_data_files_count: Настройки:
  • Требуется формат Iceberg версии 2 (или выше). Таблицы версии 1 отклоняются, поскольку в их снимках отсутствуют указатели manifest-list, необходимые для безопасного определения набора достижимых файлов. Выполнение команды для таблицы v1 возвращает ошибку BAD_ARGUMENTS.
  • Обе настройки allow_insert_into_iceberg и allow_iceberg_remove_orphan_files должны быть включены
  • Рекомендуется запускать expire_snapshots перед remove_orphan_files, чтобы сначала очищались файлы, на которые ссылаются только истёкшие снимки
  • Используйте dry_run = 1, чтобы предварительно просмотреть осиротевшие файлы перед удалением
  • Порог older_than защищает от удаления файлов из ещё не завершённых операций записи — значение по умолчанию, равное 3 дням, обеспечивает достаточный запас безопасности

См. также

Последнее изменение 2 июля 2026 г.