Табличная функция iceberg
Предоставляет табличный интерфейс только для чтения к таблицам Apache Iceberg в Amazon S3, Azure, HDFS или локальном хранилище.
Синтаксис
Аргументы
Описание аргументов аналогично описанию аргументов в табличных функциях s3, azureBlobStorage, HDFS и file соответственно.
format обозначает формат файлов с данными в таблице Iceberg.
Возвращаемое значение
Таблица с указанной структурой для чтения данных из указанной таблицы Iceberg.
Пример
ClickHouse в настоящее время поддерживает чтение формата Iceberg версий v1 и v2 с помощью табличных функций icebergS3, icebergAzure, icebergHDFS и icebergLocal, а также табличных движков IcebergS3, icebergAzure, IcebergHDFS и IcebergLocal.
Определение именованной коллекции
Ниже приведён пример настройки именованной коллекции для хранения URL-адреса и учётных данных:
Эволюция схемы
На данный момент с помощью ClickHouse вы можете читать таблицы Iceberg, схема которых изменялась со временем. Мы поддерживаем чтение таблиц, в которых столбцы добавлялись и удалялись, а их порядок изменялся. Вы также можете изменить столбец с обязательным значением на столбец, в котором допускается значение NULL. Дополнительно мы поддерживаем допустимое приведение типов для простых типов, а именно:
- int -> long
- float -> double
- decimal(P, S) -> decimal(P', S), где P' > P.
В настоящее время невозможно изменять вложенные структуры или типы элементов внутри массивов и структур map.
Отсечение партиций
ClickHouse поддерживает отсечение партиций при выполнении запросов SELECT к таблицам Iceberg, что помогает оптимизировать производительность запросов за счёт пропуска нерелевантных файлов данных. Чтобы включить отсечение партиций, установите use_iceberg_partition_pruning = 1. Для получения дополнительной информации об отсечении партиций в Iceberg см. https://iceberg.apache.org/spec/#partitioning
Time Travel
ClickHouse поддерживает механизм Time Travel для таблиц Iceberg, позволяющий выполнять запросы к историческим данным на указанную метку времени или по идентификатору снимка (snapshot).
Обработка таблиц с удалёнными строками
В настоящее время поддерживаются только таблицы Iceberg, использующие position deletes.
Следующие методы удаления не поддерживаются:
- Equality deletes
- Deletion vectors (добавлены в v3)
Базовое использование
Note: Нельзя указывать параметры iceberg_timestamp_ms и iceberg_snapshot_id в одном и том же запросе.
Важные замечания
-
Снимки (snapshots) обычно создаются, когда:
-
В таблицу записываются новые данные
-
Выполняется операция по уплотнению данных (compaction)
-
Изменения схемы обычно не создают новых снимков — это приводит к важным особенностям поведения при использовании time travel для таблиц, в которых происходила эволюция схемы.
Примеры сценариев
Все сценарии приведены в Spark, так как ClickHouse пока не поддерживает запись в таблицы Iceberg.
Сценарий 1: изменения схемы без новых снимков
Рассмотрим следующую последовательность операций:
Результаты запроса на разных временных метках:
- В моменты ts1 и ts2: отображаются только исходные два столбца
- В момент ts3: отображаются все три столбца, при этом для цены в первой строке указано значение NULL
Сценарий 2: различия между исторической и текущей схемой
Запрос time travel, выполненный в текущий момент, может показать схему, отличающуюся от схемы текущей таблицы:
Это происходит потому, что 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 Catalogs обычно отвечают за разрешение метаданных, табличная функция 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.
Пример
УДАЛЕНИЕ
В ClickHouse также поддерживается удаление строк в формате merge-on-read. Этот запрос создаст новый снимок с файлами позиционного удаления.
ПРИМЕЧАНИЕ: если в будущем вы захотите читать свои таблицы с помощью других движков Iceberg (таких как Spark), вам нужно отключить настройки output_format_parquet_use_custom_encoder и output_format_parquet_parallel_encoding.
Это связано с тем, что Spark читает эти файлы по идентификаторам полей Parquet (field-ids), в то время как ClickHouse в настоящее время не поддерживает запись идентификаторов полей при включённых этих флагах.
Мы планируем исправить это поведение в будущем.
Пример
Эволюция схемы
ClickHouse позволяет добавлять, удалять или изменять столбцы с простыми типами (не tuple, не array, не map).
Пример
ALTER TABLE iceberg_writes_example DROP COLUMN z; SHOW CREATE TABLE iceberg_writes_example; ┌─statement─────────────────────────────────────────────────┐
- │ CREATE TABLE default.iceberg_writes_example ↴│
│↳( ↴│
│↳
xNullable(String), ↴│ │↳yNullable(Int64) ↴│ │↳) ↴│ │↳ENGINE = IcebergLocal('/home/scanhex12/iceberg_example/') │ └───────────────────────────────────────────────────────────┘
SELECT * FROM iceberg_writes_example FORMAT VERTICAL;
Строка 1: ────── x: Ivanov y: 993
Таблица с каталогами
Все описанные выше возможности записи также доступны с REST- и Glue‑каталогами.
Чтобы использовать их, создайте таблицу с табличным движком IcebergS3 и укажите необходимые настройки: