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

Прямые запросы к открытым табличным форматам

ClickHouse предоставляет табличные функции для выполнения запросов к данным, хранящимся в открытых табличных форматах непосредственно в объектном хранилище. Для этого не требуется подключение к внешнему каталогу — запросы выполняются по данным на месте, аналогично тому, как AWS Athena читает из S3.

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

Сервер, clickhouse-local или chDB

Действия, описанные в этом руководстве, можно выполнить, используя существующую установку сервера ClickHouse. Для разовых запросов вы можете вместо этого использовать clickhouse-local и выполнить тот же рабочий процесс без запуска сервера. С небольшими изменениями этот процесс также может быть выполнен с использованием встроенного дистрибутива ClickHouse, chDB.

Следующие примеры используют датасет hits, сохранённый в каждом lakehouse‑формате в S3. Для каждого lakehouse‑формата существуют отдельные функции для каждого провайдера объектного хранилища.

Табличная функция iceberg (псевдоним для icebergS3) читает таблицы Iceberg непосредственно из объектного хранилища. Для каждого бэкенда хранилища предусмотрен отдельный вариант: icebergS3, icebergAzure, icebergHDFS и icebergLocal.

Пример синтаксиса:

icebergS3(url [, NOSIGN | access_key_id, secret_access_key, [session_token]] [,format] [,compression_method])

icebergAzure(connection_string|storage_account_url, container_name, blobpath, [,account_name], [,account_key] [,format] [,compression_method])

icebergLocal(path_to_table, [,format] [,compression_method])
Поддержка GCS

Вариант функций S3 можно использовать для Google Cloud Storage (GCS).

Пример:

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

┌─url────────────────────────────────────────────────┬─────cnt─┐
│ http://liver.ru/belgorod/page/1006.jки/доп_приборы │ 3288173 │ -- 3.29 million
│ http://kinopoisk.ru                                │ 1625250 │ -- 1.63 million
│ http://bdsm_po_yers=0&with_video                   │  791465 │
│ http://video.yandex                                │  582400 │
│ http://smeshariki.ru/region                        │  514984 │
└────────────────────────────────────────────────────┴─────────┘

5 rows in set. Elapsed: 3.375 sec. Processed 100.00 million rows, 9.98 GB (29.63 million rows/s., 2.96 GB/s.)
Peak memory usage: 10.48 GiB.

Кластерный вариант

Функция icebergS3Cluster распределяет операции чтения между несколькими узлами кластера ClickHouse. Узел-инициатор устанавливает соединения со всеми узлами и динамически раздаёт файлы данных на обработку. Каждый рабочий узел запрашивает и обрабатывает задачи до тех пор, пока не будут прочитаны все файлы. icebergCluster — псевдоним для icebergS3Cluster. Также существуют варианты для Azure (icebergAzureCluster) и HDFS (icebergHDFSCluster).

Пример синтаксиса:

icebergS3Cluster(cluster_name, url [, NOSIGN | access_key_id, secret_access_key, [session_token]] [,format] [,compression_method])
-- icebergCluster is an alias for icebergS3Cluster

icebergAzureCluster(cluster_name, connection_string|storage_account_url, container_name, blobpath, [,account_name], [,account_key] [,format] [,compression_method])

Пример (ClickHouse Cloud):

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

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

В качестве альтернативы использованию табличной функции в каждом запросе можно создать постоянную таблицу с помощью движка таблиц Iceberg. Данные по-прежнему хранятся в объектном хранилище и считываются по требованию — никакие данные не копируются в ClickHouse. Преимущество заключается в том, что определение таблицы хранится в ClickHouse и доступно всем пользователям и сессиям без необходимости указывать путь к хранилищу и учётные данные для каждого пользователя. Для каждого бэкенда хранилища предусмотрены соответствующие варианты движка: IcebergS3 (или псевдоним Iceberg), IcebergAzure, IcebergHDFS и IcebergLocal.

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

Пример синтаксиса:

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

CREATE TABLE iceberg_table
    ENGINE = IcebergS3(url [, NOSIGN | access_key_id, secret_access_key, [session_token]] [,format] [,compression_method])

CREATE TABLE iceberg_table
    ENGINE = IcebergAzure(connection_string|storage_account_url, container_name, blobpath, [account_name, account_key, format, compression])

CREATE TABLE iceberg_table
    ENGINE = IcebergLocal(path_to_table, [,format] [,compression_method])
Поддержка GCS

Вариант табличного движка S3 можно использовать для Google Cloud Storage (GCS).

Пример:

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

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

┌─url────────────────────────────────────────────────┬─────cnt─┐
│ http://liver.ru/belgorod/page/1006.jки/доп_приборы │ 3288173 │
│ http://kinopoisk.ru                                │ 1625250 │
│ http://bdsm_po_yers=0&with_video                   │  791465 │
│ http://video.yandex                                │  582400 │
│ http://smeshariki.ru/region                        │  514984 │
└────────────────────────────────────────────────────┴─────────┘

5 rows in set. Elapsed: 2.737 sec. Processed 100.00 million rows, 9.98 GB (36.53 million rows/s., 3.64 GB/s.)
Peak memory usage: 10.53 GiB.

Список поддерживаемых функций, включая отсечение партиций, эволюцию схемы, перемещение во времени, кэширование и другое, см. в матрице поддержки. Полную справочную информацию см. в документации по табличной функции iceberg и движку таблиц Iceberg.