Перейти к основному содержимому
Перейти к основному содержимому

Движок таблиц Iceberg

осторожно

Мы рекомендуем использовать Табличную функцию Iceberg для работы с данными Iceberg в ClickHouse. Табличная функция Iceberg в настоящее время предоставляет достаточную функциональность, предлагая частичный интерфейс только для чтения для таблиц Iceberg.

Движок таблиц Iceberg доступен, но может иметь ограничения. ClickHouse изначально не был разработан для поддержки таблиц с внешне изменяющимися схемами, что может повлиять на функциональность движка таблиц Iceberg. В результате некоторые функции, работающие с обычными таблицами, могут быть недоступны или могут работать некорректно, особенно при использовании старого анализатора.

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

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

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

Обратите внимание, что таблица Iceberg должна уже существовать в хранилище, эта команда не принимает параметры DDL для создания новой таблицы.

Аргументы движка

Описание аргументов совпадает с описанием аргументов в движках S3, AzureBlobStorage, HDFS и File соответственно. format обозначает формат файлов данных в таблице Iceberg.

Параметры движка можно указывать с помощью Именованных коллекций

Пример

Используя именованные коллекции:

Псевдонимы

Движок таблиц Iceberg является псевдонимом для IcebergS3 в настоящее время.

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

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

  • int -> long
  • float -> double
  • decimal(P, S) -> decimal(P', S), где P' > P.

В настоящее время невозможно изменить вложенные структуры или типы элементов внутри массивов и карт.

Чтобы прочитать таблицу, схема которой изменилась после ее создания с динамическим выводом схемы, установите allow_dynamic_metadata_for_data_lakes = true при создании таблицы.

Обрезка разделов

ClickHouse поддерживает обрезку разделов во время SELECT-запросов к таблицам Iceberg, что помогает оптимизировать производительность запросов путем пропуска неактуальных файлов данных. В настоящее время она работает только с трансформациями идентичности и временными трансформациями (час, день, месяц, год). Чтобы включить обрезку разделов, установите use_iceberg_partition_pruning = 1.

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

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

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

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

Важные замечания

  • Снимки обычно создаются, когда:

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

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

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

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

Рассмотрим эту последовательность операций:

Результаты запросов в разные временные моменты:

  • На ts1 и ts2: Появляются только оригинальные два столбца
  • На ts3: Появляются все три столбца, при этом для первого ряда цена равна NULL

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

Запрос на путешествие во времени в текущий момент может показать другую схему, чем текущая таблица:

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

Сценарий 3: Историческое состояние таблицы

В третьем случае при путешествии во времени нельзя получить состояние таблицы до того, как в нее были записаны какие-либо данные:

В ClickHouse поведение аналогично Spark. Вы можете легко заменить запросы Select Spark запросами Select ClickHouse, и это будет работать так же.

Кэш данных

Движок таблиц Iceberg и табличная функция поддерживают кэширование данных, аналогично хранилищам S3, AzureBlobStorage, HDFS. См. здесь.

См. также