CREATE TABLE
Без явной схемы таблица Iceberg уже должна существовать в хранилище. Чтобы создать новую автономную таблицу Iceberg в backend-соединении с правом записи, укажите её схему в оператореCREATE TABLE.
Аргументы движка
Описание аргументов аналогично описанию аргументов для движковS3, AzureBlobStorage, HDFS и File.
format обозначает формат файлов данных в таблице Iceberg.
Для IcebergS3 можно использовать необязательный параметр extra_credentials, чтобы передать role_arn для доступа на основе ролей в ClickHouse Cloud. Инструкции по настройке см. в разделе Secure S3.
Параметры движка можно указать с помощью именованных коллекций
Пример
Псевдонимы
Движок таблицыIceberg автоматически определяет backend хранилища по настройке disk и соответственно направляет запросы в IcebergS3, IcebergAzure или IcebergLocal. Если disk не указан, по умолчанию используется реализация IcebergS3.
Типы данных
В следующей таблице показано, как типы данных Iceberg сопоставляются с типами данных ClickHouse при определении схемы (для чтения).Примитивные типы
Сложные типы
Ограничения совместимости схемы и записи
Приведённые выше сопоставления типов данных относятся к чтению. При создании или изменении схем Iceberg и записи данных в ClickHouse действуют следующие ограничения:- ClickHouse не может создать схему Iceberg, содержащую
Bool,Decimal,FixedString,Int8,UInt8,Int16илиUInt16, а также добавить столбец одного из этих типов или изменить тип столбца на один из них. Операция завершается исключением о неподдерживаемом типе. Это не препятствует вставке значенийBoolилиDecimalв существующие столбцы Iceberg. - При создании или изменении схемы Iceberg ClickHouse сопоставляет каждый столбец
DateTimeиDateTime64с типом Icebergtimestamp, который имеет микросекундную точность и не содержит информации о часовом поясе. ClickHouse не может генерировать типы схемыtimestamptz,timestamp_nsилиtimestamptz_ns, поэтому более высокая точность и семантика часового пояса не отражаются в схеме Iceberg. - ClickHouse не может записывать данные в таблицу Iceberg, где столбец
decimal,fixed,timestamp_nsилиtimestamptz_nsиспользуется как непосредственное поле партиции. Операция завершается исключением о неподдерживаемом типе. - Для файлов данных, содержащих типы, границы которых ClickHouse не может сериализовать, включая
BoolиDecimal, ClickHouse не указывает в записи манифеста Iceberg нижние и верхние границы всех столбцов. Размеры столбцов и количество значений null по-прежнему включаются, а данные остаются корректными, но средства чтения не могут использовать отсечение min-max на уровне манифеста для этих файлов.
Эволюция схемы
ClickHouse поддерживает чтение таблиц Iceberg, чья схема со временем менялась. Это относится к таблицам, в которых столбцы были добавлены, удалены или переставлены, а также к столбцам, изменённым с обязательных на Nullable. Кроме того, поддерживаются следующие приведения типов:- int -> long
- float -> double
- decimal(P, S) -> decimal(P’, S) where P’ > P.
Отсечение партиций
ClickHouse поддерживает отсечение партиций в запросах SELECT к таблицам Iceberg, что помогает повысить производительность запросов за счёт пропуска ненужных файлов данных. Чтобы включить отсечение партиций, установитеuse_iceberg_partition_pruning = 1. Дополнительные сведения об отсечении партиций в Iceberg см. по адресу https://iceberg.apache.org/spec/#partitioning
Путешествия во времени
ClickHouse поддерживает путешествия во времени для таблиц Iceberg, что позволяет выполнять запросы к историческим данным по конкретной временной метке или идентификатору снимка.Уплотнение файлов манифеста
Со временем из-за частых операций записи в таблице Iceberg в списке файлов манифеста текущего снимка может накапливаться большое количество небольших файлов манифеста. Длинный список файлов манифеста замедляет планирование запроса, поскольку для обнаружения файлов данных нужно прочитать каждый файл манифеста. ClickHouse может уплотнить эти файлы манифеста, объединив их в меньшее число более крупных, с помощью оператораOPTIMIZE TABLE ... MANIFEST:
replace), который ссылается на те же файлы данных через консолидированный набор файлов манифестов. Файлы данных не перезаписываются, строки не добавляются, не удаляются и не дедуплицируются — перестраивается только слой манифестов.
Требования и поведение
- Эта возможность является экспериментальной и доступна только при включенной настройке
allow_experimental_iceberg_compaction. Оператор генерирует исключение, если настройка не включена. - Уплотнение выполняется только тогда, когда число файлов манифеста в списке файлов манифеста текущего снимка превышает порог, заданный настройкой
iceberg_manifest_min_count_to_compact(по умолчанию100— документированное значение по умолчанию свойства таблицы Icebergcommit.manifest.min-count-to-merge). Если текущее число меньше или равно порогу, уплотнение пропускается и новый снимок не создается. Уменьшите порог, чтобы запускать уплотнение при меньшем количестве файлов манифеста. OPTIMIZE TABLE ... MANIFESTподдерживается только для таблиц Iceberg. Попытка выполнить его для таблицы с любым другим движком генерирует исключение.OPTIMIZE TABLE ... MANIFESTподдерживается только для таблиц Iceberg формата версии 2. Выполнение для таблицы формата версии 1 генерирует исключение, как и выполнение для таблицы формата версии 3, поскольку для метаданных v3 row-lineagefirst_row_idпока не поддерживается корректное сохранение при переписывании манифеста.OPTIMIZE TABLE ... MANIFESTне поддерживается для зашифрованных таблиц Iceberg, чьи файлы данных содержатkey_metadataна уровне отдельных файлов. Сохранение этих метаданных шифрования при переписывании манифеста пока не реализовано, поэтому оператор генерирует исключениеNOT_IMPLEMENTED.
Обработка таблиц с удалёнными строками
ClickHouse поддерживает чтение таблиц Iceberg, в которых используются следующие методы удаления:- Позиционное удаление
- Удаление по равенству (поддерживается начиная с версии 25.8+)
- Векторы удаления (Добавленный в v3)
ALTER TABLE ... DELETE и ALTER TABLE ... UPDATE не поддерживаются для таблиц Iceberg с версией формата 3.
Базовое использование
iceberg_timestamp_ms и iceberg_snapshot_id одновременно.
Важные замечания
-
Снимки обычно создаются, когда:
- В таблицу записываются новые данные
- Выполняется тот или иной вид компактации данных
- Изменения схемы обычно не создают снимки — это приводит к важным особенностям при использовании time travel с таблицами, схема которых изменялась.
Примеры сценариев
В этих сценариях Spark используется для демонстрации изменений схемы, внесённых внешним средством записи в Iceberg.Сценарий 1: Изменения схемы без новых снимков
Рассмотрим следующую последовательность операций:- В ts1 & ts2: отображаются только два исходных столбца
- В ts3: отображаются все три столбца, при этом в столбце price для первой строки указано NULL
Сценарий 2: Различия между исторической и текущей схемой
Запрос путешествия во времени для текущего момента может показать схему, отличающуюся от схемы текущей таблицы:ALTER TABLE не создает новый снимок, а для текущей таблицы Spark берет значение schema_id из последнего файла метаданных, а не из снимка.
Сценарий 3: Различия между исторической и текущей схемой
Второй нюанс в том, что при использовании путешествия во времени невозможно получить состояние таблицы на момент, когда в неё ещё не было записано никаких данных:Определение файла метаданных
При использовании движка таблицы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 в ClickHouse напрямую интерпретирует файлы, хранящиеся в S3, как таблицы Iceberg, поэтому важно понимать эти правила разрешения.
Кэш данных
Движок таблицыIceberg и табличная функция Iceberg поддерживают кэширование данных, как и хранилища S3, AzureBlobStorage и HDFS. См. здесь.
Кэш метаданных
Движок таблицыIceberg и табличная функция поддерживают кэш метаданных, в котором хранится информация о файлах manifest, manifest list и JSON метаданных. Кэш хранится в памяти. Эта возможность управляется настройкой use_iceberg_metadata_files_cache, которая по умолчанию включена.
Асинхронная предварительная выборка метаданных
Асинхронную предварительную выборку метаданных можно включить при создании таблицыIceberg, задав iceberg_metadata_async_prefetch_period_ms. Если задано значение 0 (по умолчанию) или если кэширование метаданных не включено, асинхронная предварительная выборка отключается.
Чтобы включить эту возможность, нужно указать ненулевое значение в миллисекундах. Оно задает интервал между циклами предварительной выборки.
Если возможность включена, сервер будет периодически выполнять фоновую операцию: опрашивать удаленный каталог и обнаруживать новую версию метаданных. Затем он разберет ее и рекурсивно пройдет по снимку, загружая активные файлы списков манифестов и файлы манифестов.
Файлы, уже доступные в кэше метаданных, не будут загружаться повторно. В конце каждого цикла предварительной выборки последний снимок метаданных будет доступен в кэше метаданных.
iceberg_metadata_staleness_ms следует указывать как параметр запроса или сеанса. По умолчанию (0 — не указано) в контексте каждого запроса сервер будет получать актуальные метаданные из удалённого каталога.
Если указать допустимую степень устаревания метаданных, сервер сможет использовать кэшированную версию снимка метаданных без обращения к удалённому каталогу. Если версия метаданных есть в кэше и была загружена в пределах заданного интервала устаревания, она будет использована для обработки запроса.
В противном случае из удалённого каталога будет получена последняя версия.
ICEBERG_SCEDULE_POOL, который представляет собой серверный пул потоков для фоновых операций с активными таблицами Iceberg. Размер этого пула потоков задается параметром конфигурации сервера iceberg_background_schedule_pool_size (по умолчанию — 10).
Примечание: В настоящее время предполагается, что размер кэша метаданных достаточен для полного хранения последнего снимка метаданных для всех активных таблиц, если включена асинхронная предварительная загрузка.