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

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

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.