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

Начало работы с озерами данных

Вкратце

Практическое руководство по выполнению запросов к таблицам озера данных, ускорению их с помощью MergeTree и записи результатов обратно в Iceberg. Во всех шагах используются общедоступные наборы данных; они работают как в Cloud, так и в OSS.

Скриншоты в этом руководстве взяты из SQL-консоли ClickHouse Cloud. Все запросы работают как в Cloud, так и в самоуправляемых развертываниях.

Прямые запросы к данным Iceberg

Самый быстрый способ начать работу — использовать табличную функцию icebergS3(): укажите на таблицу Iceberg в S3 и сразу выполняйте запросы — никакой предварительной настройки не требуется.

Изучите схему:

DESCRIBE icebergS3('https://datasets-documentation.s3.amazonaws.com/lake_formats/iceberg/')

Выполните запрос:

SELECT
    url,
    count() AS cnt
FROM icebergS3('https://datasets-documentation.s3.amazonaws.com/lake_formats/iceberg/')
GROUP BY url
ORDER BY cnt DESC
LIMIT 5
Запрос к Iceberg

ClickHouse считывает метаданные Iceberg напрямую из S3 и автоматически определяет схему. Тот же подход применим для deltaLake(), hudi() и paimon().

Подробнее: Прямые запросы к открытым табличным форматам — описание всех четырёх форматов, кластерных вариантов для распределённого чтения и параметров серверной части хранилища (S3, Azure, HDFS, локальное).

Создание постоянного табличного движка

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

CREATE TABLE hits_iceberg
    ENGINE = IcebergS3('https://datasets-documentation.s3.amazonaws.com/lake_formats/iceberg/')

Теперь выполните запрос к ней, как к любой таблице ClickHouse:

SELECT
    url,
    count() AS cnt
FROM hits_iceberg
GROUP BY url
ORDER BY cnt DESC
LIMIT 5
Запрос к Iceberg

Движок таблиц поддерживает кэширование данных, кэширование метаданных, эволюцию схемы и перемещение во времени. Подробнее о возможностях движка таблиц см. в руководстве Прямые запросы, а полное сравнение функций — в матрице поддержки.

Подключение к каталогу

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

Ниже приведён пример подключения к AWS Glue:

CREATE DATABASE my_lake
ENGINE = DataLakeCatalog
SETTINGS
    catalog_type = 'glue',
    region = '<your-region>',
    aws_access_key_id = '<your-access-key>',
    aws_secret_access_key = '<your-secret-key>'

Каждый тип каталога требует собственных настроек подключения — полный список поддерживаемых каталогов и их параметров конфигурации см. в руководствах по каталогам.

Просматривайте таблицы и выполняйте запросы:

SHOW TABLES FROM my_lake;
SELECT count(*) FROM my_lake.`<database>.<table>`
Примечание

Обратные кавычки вокруг <database>.<table> обязательны, поскольку ClickHouse не поддерживает более одного пространства имён нативно.

Подробнее: Подключение к каталогу данных — полное руководство по настройке Unity Catalog с примерами для Delta и Iceberg.

Выполнение запроса

Независимо от того, какой метод вы использовали выше — табличная функция, движок таблиц или каталог — один и тот же ClickHouse SQL работает во всех случаях:

-- Table function
SELECT url, count() AS cnt
FROM icebergS3('https://datasets-documentation.s3.amazonaws.com/lake_formats/iceberg/')
GROUP BY url ORDER BY cnt DESC LIMIT 5

-- Table engine
SELECT url, count() AS cnt
FROM hits_iceberg
GROUP BY url ORDER BY cnt DESC LIMIT 5

-- Catalog
SELECT url, count() AS cnt
FROM my_lake.`<database>.<table>`
GROUP BY url ORDER BY cnt DESC LIMIT 5

Синтаксис запроса идентичен — изменяется только секция FROM. Все функции SQL ClickHouse, объединения и агрегации работают одинаково вне зависимости от источника данных.

Загрузка подмножества данных в ClickHouse

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

Сначала выполните отфильтрованный запрос к таблице Iceberg, чтобы получить базовые показатели:

SELECT
    url,
    count() AS cnt
FROM hits_iceberg
WHERE counterid = 38
GROUP BY url
ORDER BY cnt DESC
LIMIT 5

Этот запрос сканирует весь набор данных в S3, поскольку Iceberg не учитывает фильтр counterid — выполнение может занять несколько секунд.

Запрос к Iceberg

Теперь создайте таблицу MergeTree и загрузите данные:

CREATE TABLE hits_clickhouse
(
    url String,
    eventtime DateTime,
    counterid UInt32
)
ENGINE = MergeTree()
ORDER BY (counterid, eventtime);
INSERT INTO hits_clickhouse
SELECT url, eventtime, counterid
FROM hits_iceberg

Повторно выполните тот же запрос к таблице MergeTree:

SELECT
    url,
    count() AS cnt
FROM hits_clickhouse
WHERE counterid = 38
GROUP BY url
ORDER BY cnt DESC
LIMIT 5
Запрос к ClickHouse

Поскольку counterid является первым столбцом в ключе ORDER BY, разреженный первичный индекс ClickHouse переходит непосредственно к нужным гранулам — считывая только строки, где counterid = 38, вместо сканирования всех 100 миллионов строк. Это обеспечивает значительное ускорение.

Руководство по ускорению аналитики развивает эту тему, рассматривая типы LowCardinality, полнотекстовые индексы и оптимизированные ключи сортировки, и демонстрирует ~40-кратное ускорение на наборе данных из 283 миллионов строк.

Подробнее: Ускорение аналитики с MergeTree — оптимизация схемы, полнотекстовое индексирование и полное сравнение производительности до и после.

Запись данных обратно в Iceberg

ClickHouse также может записывать данные обратно в таблицы Iceberg, обеспечивая обратные ETL-процессы — публикацию агрегированных результатов или подмножеств данных для использования другими инструментами (Spark, Trino, DuckDB и др.).

Создайте таблицу Iceberg для вывода данных:

CREATE TABLE output_iceberg
(
    url String,
    cnt UInt64
)
ENGINE = IcebergS3('https://your-bucket.s3.amazonaws.com/output/', 'access_key', 'secret_key')

Запись агрегированных результатов:

SET allow_experimental_insert_into_iceberg = 1;

INSERT INTO output_iceberg
SELECT
    url,
    count() AS cnt
FROM hits_clickhouse
GROUP BY url
ORDER BY cnt DESC

Полученная таблица Iceberg доступна для чтения в любом совместимом с Iceberg движке.

Подробнее: Запись данных в открытые табличные форматы — запись необработанных данных и агрегированных результатов на основе набора данных UK Price Paid, включая вопросы проектирования схемы при сопоставлении типов ClickHouse с форматом Iceberg.

Следующие шаги

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