Learning Platform
Глоссарий Troubleshooting
Урок 12.09 · 25 мин
Продвинутый
IcebergDelta LakeHudilakehousetable functions

Delta Lake, Hudi и Iceberg

ClickHouse может выступать как query engine поверх open table formats — Apache Iceberg, Delta Lake и Apache Hudi. Без ETL и без копирования данных: достаточно указать S3-путь к таблице, и ClickHouse прочитает метаданные и данные напрямую.


Apache Iceberg

Iceberg — открытый табличный формат с ACID-семантикой, schema evolution и time travel. ClickHouse читает Iceberg-таблицы через icebergS3:

-- Прямой запрос к Iceberg-таблице в S3
SELECT user_id, event_type, count()
FROM icebergS3(
    's3://analytics-bucket/events/',
    'AWS_KEY_ID',
    'AWS_SECRET_KEY'
)
GROUP BY user_id, event_type
LIMIT 10;

ClickHouse автоматически читает Iceberg metadata files (metadata/ директория), определяет актуальный snapshot и читает только нужные data files (Parquet).

Cluster variant (распределённое чтение):

-- Чтение через несколько узлов кластера (GA 24.12+)
SELECT count()
FROM icebergS3Cluster(
    'my_cluster',
    's3://analytics-bucket/large-events/',
    'AWS_KEY_ID',
    'AWS_SECRET_KEY'
);

icebergS3Cluster распределяет чтение data files по узлам кластера — полезно для очень больших Iceberg-таблиц.

TIP

Read-only icebergS3 — лишь одна сторона интеграции. Двунаправленный Iceberg (запись через IcebergMergeTree и INSERT INTO TABLE FUNCTION icebergS3(...)) появился в 25.7-25.9 поэтапно и официально объявлен production-ready в 26.2 LTS. ClickHouse 26.3 LTS включает все возможности 25.7-25.9 как production-ready. Подробности и ограничения write-режима (commit-throughput, optimistic concurrency) — см. урок 15-04 “Apache Iceberg: от read-only до bidirectional”.


Delta Lake

Delta Lake — open table format от Databricks с ACID-транзакциями и transaction log. ClickHouse читает через deltaLakeS3:

-- Запрос к Delta Lake таблице
SELECT user_id, sum(amount) AS total_spend
FROM deltaLakeS3(
    's3://data-lake-bucket/transactions/',
    'AWS_KEY_ID',
    'AWS_SECRET_KEY'
)
WHERE event_date >= '2024-01-01'
GROUP BY user_id;

ClickHouse читает Delta Lake transaction log (_delta_log/ директория), определяет актуальные Parquet файлы (с учётом ADD/REMOVE записей) и строит результат.

Cluster variant:

SELECT count()
FROM deltaLakeCluster(
    'my_cluster',
    's3://data-lake-bucket/transactions/',
    'AWS_KEY_ID',
    'AWS_SECRET_KEY'
);

Apache Hudi

Apache Hudi — open table format с поддержкой upsert и incremental processing. ClickHouse читает через hudi:

-- Запрос к Hudi таблице
SELECT rider, driver, fare
FROM hudi(
    's3://hudi-bucket/trips/',
    'AWS_KEY_ID',
    'AWS_SECRET_KEY'
)
WHERE fare > 100;

ClickHouse читает .hoodie/ metadata директорию для определения актуальных файлов (Hudi timeline) и возвращает текущий snapshot таблицы.

Cluster variant:

SELECT count()
FROM hudiCluster(
    'my_cluster',
    's3://hudi-bucket/trips/',
    'AWS_KEY_ID',
    'AWS_SECRET_KEY'
);

Read vs Write по форматам

В 26.3 LTS Iceberg уже поддерживает запись (production-ready с 26.2): INSERT INTO TABLE FUNCTION icebergS3(...) и движок IcebergMergeTree. Delta Lake и Hudi на момент 26.3 LTS остаются read-only — для них запись идёт через стандартный Parquet sink:

-- Запись в Parquet (совместимый с Delta/Hudi reader)
INSERT INTO FUNCTION s3(
    's3://bucket/output/data.parquet',
    'AWS_KEY_ID',
    'AWS_SECRET_KEY',
    'Parquet'
)
SELECT *
FROM source_table;
ФорматReadWriteGA (кластерные варианты)
Icebergдада (production-ready с 26.2, доступно в 26.3 LTS; ограничения по commit-throughput)24.12+
Delta Lakeданет (через Parquet sink)24.12+
Hudiданет (через Parquet sink)24.12+

Выбор функции по сценарию

-- Если таблица создана Spark/Flink через Apache Iceberg Catalog:
SELECT * FROM icebergS3('s3://bucket/path/');

-- Если таблица создана Databricks Delta или spark.write.format("delta"):
SELECT * FROM deltaLakeS3('s3://bucket/path/');

-- Если таблица создана через Apache Hudi (DeltaStreamer, Spark Hudi):
SELECT * FROM hudi('s3://bucket/path/');

-- Если нужно распределённое чтение большой таблицы по кластеру:
SELECT * FROM icebergS3Cluster('cluster_name', 's3://bucket/path/');

Ключевые выводы

  1. ClickHouse читает Apache Iceberg, Delta Lake и Hudi напрямую через table functions без ETL и копирования данных.
  2. icebergS3('s3://path/') — для Iceberg-таблиц: читает metadata/ директорию и актуальный snapshot.
  3. deltaLakeS3('s3://path/') — для Delta Lake: читает _delta_log/ и текущие Parquet files.
  4. hudi('s3://path/') — для Hudi: читает .hoodie/ timeline и текущий snapshot.
  5. Cluster variants (icebergS3Cluster, deltaLakeCluster, hudiCluster) доступны GA с 24.12+ и распределяют чтение по узлам кластера.
  6. В 26.3 LTS Iceberg поддерживает запись (production-ready с 26.2: IcebergMergeTree + INSERT INTO TABLE FUNCTION icebergS3). Delta Lake и Hudi остаются read-only — запись идёт через Parquet sink. Подробности по Iceberg write — урок 15-04.
Delta Lake: transaction log, snapshots и ACID на объектном хранилище Apache Iceberg: каталог, иерархия метаданных и snapshot isolation

Проверьте понимание

Результат: 0 из 0
Прикладной
Вопрос 1 из 5. Команда хранит аналитические данные в Apache Iceberg-таблице на S3 (path: s3://analytics/events/). Нужно выполнить ad-hoc запрос из ClickHouse без ETL. Какая table function правильная?

Закончили урок?

Отметьте его как пройденный, чтобы отслеживать свой прогресс

Войдите чтобы оценить урок

Прогресс модуля
0 из 11