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-таблиц.
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;
| Формат | Read | Write | GA (кластерные варианты) |
|---|---|---|---|
| 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/');
Ключевые выводы
- ClickHouse читает Apache Iceberg, Delta Lake и Hudi напрямую через table functions без ETL и копирования данных.
icebergS3('s3://path/')— для Iceberg-таблиц: читает metadata/ директорию и актуальный snapshot.deltaLakeS3('s3://path/')— для Delta Lake: читает _delta_log/ и текущие Parquet files.hudi('s3://path/')— для Hudi: читает .hoodie/ timeline и текущий snapshot.- Cluster variants (
icebergS3Cluster,deltaLakeCluster,hudiCluster) доступны GA с 24.12+ и распределяют чтение по узлам кластера. - В 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.