Табличная функция iceberg
Предоставляет табличный интерфейс только для чтения к таблицам Apache Iceberg, размещённым в Amazon S3, Azure, HDFS или в локальном хранилище.
Синтаксис
Аргументы
Описание аргументов аналогично описанию аргументов в табличных функциях s3, azureBlobStorage, HDFS и file соответственно.
format обозначает формат файлов с данными в таблице Iceberg.
Возвращаемое значение
Таблица с указанной структурой для чтения данных из указанной таблицы Iceberg.
Пример
На данный момент ClickHouse поддерживает чтение версий v1 и v2 формата Iceberg с помощью табличных функций 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 Data Catalog вместе с S3:
Эволюция схемы
В настоящее время с помощью CH вы можете читать таблицы Iceberg, схема которых со временем изменялась. Поддерживается чтение таблиц, в которых столбцы добавлялись и удалялись, а также изменялся их порядок. Вы также можете изменить столбец с обязательным значением на столбец, в котором допускается значение NULL. Дополнительно поддерживается допустимое приведение типов для простых типов, а именно:
- int -> long
- float -> double
- decimal(P, S) -> decimal(P', S), где P' > P.
Пока невозможно изменять вложенные структуры или типы элементов внутри массивов и отображений.
Отсечение партиций
ClickHouse поддерживает отсечение партиций при выполнении запросов SELECT к таблицам Iceberg, что помогает оптимизировать производительность запросов за счёт пропуска не относящихся к делу файлов данных. Чтобы включить отсечение партиций, установите use_iceberg_partition_pruning = 1. Для получения дополнительной информации об отсечении партиций в Iceberg см. https://iceberg.apache.org/spec/#partitioning
Time Travel
ClickHouse поддерживает механизм time travel для таблиц Iceberg, позволяющий выполнять запросы к историческим данным по заданной метке времени или идентификатору снимка.
Обработка таблиц с удалёнными строками
В настоящее время поддерживаются только таблицы Iceberg, использующие position deletes.
Следующие методы удаления не поддерживаются:
- Equality deletes
- Deletion vectors (появились в версии 3)
Основы использования
Примечание: Нельзя указывать параметры iceberg_timestamp_ms и iceberg_snapshot_id одновременно в одном запросе.
Важные замечания
-
Снимки обычно создаются в следующих случаях:
-
В таблицу записываются новые данные
-
Выполняется какой-либо вид компактации данных
-
Изменения схемы обычно не создают снимков — это приводит к важным особенностям поведения при использовании time travel для таблиц, схема которых со временем изменялась.
Примеры сценариев
Во всех сценариях используется Spark, так как ClickHouse пока не поддерживает запись в таблицы Iceberg.
Сценарий 1: изменение схемы без создания новых снимков
Рассмотрим следующую последовательность операций:
Результаты запроса в разные моменты времени:
- На ts1 и ts2: отображаются только исходные два столбца
- На ts3: отображаются все три столбца; для цены первой строки указано значение NULL
Сценарий 2: отличия исторической и текущей схем
Запрос с использованием «перемещения во времени», выполненный в текущий момент, может показывать схему, отличающуюся от актуальной схемы таблицы:
Это происходит потому, что ALTER TABLE не создает новый снимок, а для текущей таблицы Spark берет значение schema_id из последнего файла метаданных, а не из снимка.
Сценарий 3: различия между исторической и текущей схемами
Второй случай заключается в том, что при использовании механизма time travel вы не можете получить состояние таблицы до того, как в неё были записаны какие-либо данные:
В ClickHouse поведение такое же, как в Spark. Можно мысленно заменить запросы SELECT в Spark на запросы SELECT в ClickHouse — всё будет работать так же.
Определение файла метаданных
При использовании табличной функции iceberg в ClickHouse системе необходимо найти соответствующий файл metadata.json, который описывает структуру таблицы Iceberg. Ниже описано, как работает этот процесс определения:
Поиск кандидатов (в порядке приоритета)
- Явное указание пути:
*Если вы задаёте
iceberg_metadata_file_path, система будет использовать именно этот путь, добавляя его к пути каталога таблицы Iceberg.
- При наличии этого параметра все остальные параметры разрешения пути игнорируются.
-
Сопоставление UUID таблицы: *Если указан
iceberg_metadata_table_uuid, система будет: *Смотреть только файлы.metadata.jsonв каталогеmetadata*Отбирать файлы, содержащие полеtable-uuidсо значением, совпадающим с указанным UUID (без учёта регистра) -
Поиск по умолчанию: *Если ни один из вышеперечисленных параметров не задан, все файлы
.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 и табличная функция поддерживают кэш метаданных, в котором хранится информация о файлах манифестов, списках манифестов и 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
Удаление избыточных строк в формате merge-on-read также поддерживается в ClickHouse. Этот запрос создаст новый снимок с файлами позиционного удаления (position delete).
ПРИМЕЧАНИЕ: Если вы в дальнейшем хотите читать свои таблицы с помощью других движков Iceberg (таких как Spark), вам нужно отключить настройки output_format_parquet_use_custom_encoder и output_format_parquet_parallel_encoding.
Это связано с тем, что Spark читает эти файлы по идентификаторам полей parquet (field-ids), в то время как ClickHouse в данный момент не поддерживает запись field-ids при включённых этих флагах.
Мы планируем исправить это поведение в будущем.
Пример
Эволюция схемы
ClickHouse позволяет добавлять, удалять или изменять столбцы с простыми типами данных (не tuple, не array, не map).
Пример
Компакция
ClickHouse поддерживает компакцию таблиц Iceberg. В настоящее время он может объединять файлы позиционных удалений (position delete files) с файлами данных с одновременным обновлением метаданных. Идентификаторы и метки времени предыдущих снимков (snapshot IDs and timestamps) остаются неизменными, поэтому функция time-travel по‑прежнему может использоваться с теми же значениями.
Как использовать: