Learning Platform
Глоссарий Troubleshooting
Урок 12.04 · 30 мин
Продвинутый
S3MinIOtable functionnamed collectionsParquet

S3: Table Function, Engine и Named Collections

S3 — универсальный источник и приёмник данных для ClickHouse. Читать Parquet-файлы из S3 bucket, писать результаты запросов обратно в S3, строить persistent таблицы поверх объектного хранилища — всё это доступно через три встроенных механизма: s3() table function, S3 engine и Named Collections.


s3() Table Function: ad-hoc запросы

s3() table function позволяет выполнять ad-hoc запросы к S3 объектам без создания постоянных таблиц. Функция ведёт себя как обычная таблица в контексте SELECT/INSERT:

-- Простой SELECT из одного файла
SELECT count()
FROM s3(
    'http://minio:9000/clickhouse-cold/events/2026-01.parquet',
    'minioadmin',
    'minioadmin123',
    'Parquet'
);

-- Glob pattern: читать все Parquet-файлы из prefix
SELECT user_id, event_type, count() AS cnt
FROM s3(
    'http://minio:9000/clickhouse-cold/events/*.parquet',
    'minioadmin',
    'minioadmin123',
    'Parquet'
)
GROUP BY user_id, event_type
ORDER BY cnt DESC
LIMIT 10;

Glob pattern *.parquet работает на уровне имён объектов в S3 bucket. Это удобно для чтения partitioned данных (например, events/2026-01/*.parquet, events/2026-02/*.parquet).


Поддерживаемые форматы

ClickHouse поддерживает чтение и запись S3-объектов в нативных форматах аналитических данных:

ФорматЧтениеЗаписьПрименение
Parquet++Columnar, сжатый, Spark/dbt совместимый
ORC++Hadoop ecosystem
Arrow++In-memory columnar interchange
Avro+-Schema Registry, Kafka
CSV / JSONEachRow++Текстовые форматы
-- INSERT в S3 в формате Parquet
INSERT INTO FUNCTION s3(
    'http://minio:9000/clickhouse-cold/export/2026-01.parquet',
    'minioadmin', 'minioadmin123',
    'Parquet'
)
SELECT * FROM events WHERE toYYYYMM(event_time) = 202601;

S3 Engine: постоянные таблицы над S3

Если нужно обращаться к одному S3-пути многократно, создайте постоянную таблицу на основе S3 Engine:

-- S3 Engine: таблица над S3-prefix (все Parquet в папке)
CREATE TABLE events_archive
ENGINE = S3(
    'http://minio:9000/clickhouse-cold/events/*.parquet',
    'minioadmin',
    'minioadmin123',
    'Parquet'
);

-- Теперь можно делать обычные SELECT без повторения credentials
SELECT count() FROM events_archive WHERE event_type = 'purchase';

Разница между s3() function и S3 engine:

  • s3() function — однократный запрос, credentials в каждом вызове
  • S3 engine — постоянная таблица, credentials хранятся в DDL

Named Collections: централизованное управление credentials

Хранить credentials (access key, secret) в каждом SQL-запросе или DDL — плохая практика: credentials появляются в query log, трудно обновить при ротации ключей.

Named Collections решают эту проблему: credentials хранятся централизованно с контролем доступа через RBAC.

Создание Named Collection

-- Создать Named Collection для MinIO
CREATE NAMED COLLECTION minio_cold
    ACCESS MANAGEMENT 1
AS
    url = 'http://minio:9000/clickhouse-cold/',
    access_key_id = 'minioadmin',
    secret_access_key = 'minioadmin123';

Использование Named Collection

-- s3() function с Named Collection — credentials скрыты
SELECT count()
FROM s3(minio_cold, filename = 'events/*.parquet', format = 'Parquet');

-- S3 engine с Named Collection
CREATE TABLE events_archive
ENGINE = S3(minio_cold, filename = 'events/*.parquet', format = 'Parquet');
Named Collections: путь данных и изоляция credentials
SQL: s3(minio_cold, filename=..., format=...)SQL-запрос пользователя: SELECT * FROM s3(minio_cold, ...). Пользователь видит только имя Named Collection, не credentials. Для использования Named Collection нужна привилегия: GRANT NAMED COLLECTION minio_cold TO user.
ClickHouse resolves
Named Collection (minio_cold) — системное хранилищеNamed Collection хранилище: credentials хранятся в system.named_collections или конфигурационных файлах config.d/. Доступ контролируется через RBAC: только пользователи с привилегией NAMED COLLECTION могут использовать конкретную коллекцию.
подставляет credentials
S3 API → MinIO bucketS3 API запрос к MinIO: ClickHouse подставляет url, access_key_id, secret_access_key из Named Collection. Credentials не появляются в query_log, не видны пользователю. При ротации ключей — один раз обновить Named Collection.

MinIO и path-style URL

MinIO и другие S3-совместимые хранилища требуют специальной настройки для path-style доступа:

-- use_path_style_url=1 обязателен для MinIO и S3-compatible storage
SELECT count()
FROM s3(
    'http://minio:9000/clickhouse-cold/events/*.parquet',
    'minioadmin',
    'minioadmin123',
    'Parquet',
    SETTINGS use_path_style_url = 1
);

По умолчанию ClickHouse использует virtual-hosted style (bucket.endpoint/key), что несовместимо с MinIO. Параметр use_path_style_url=1 переключает на path-style (endpoint/bucket/key).

TIP

Для практики работы с s3() table function используйте лабораторную работу: labs/minio/. Лаб включает cgr.dev/chainguard/minio + clickhouse-server:26.3 с упражнениями по настройке storage policy и выполнению S3 queries. Endpoint внутри Docker-сети: http://minio:9000/ (не host-mapped порт 9002).


Сравнение подходов

ПодходСлучай использования
s3() table functionAd-hoc запросы, одноразовая миграция данных
S3 engineПовторные запросы к одному пути, DDL-определённые архивные таблицы
Named CollectionsЛюбой из выше + centralized credentials, RBAC, audit trail
S3Queue engineПотоковая загрузка файлов из S3 prefix (урок 05)

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

  1. s3() table function — ad-hoc запросы к S3 с glob pattern для чтения нескольких файлов.
  2. S3 engine — постоянная таблица над S3-путём, credentials хранятся в DDL.
  3. Named Collections — централизованное хранение credentials с RBAC; credentials не появляются в query log при ротации достаточно обновить одну запись.
  4. use_path_style_url=1 обязателен для MinIO и S3-compatible хранилищ.
  5. Поддерживаемые форматы: Parquet, ORC, Arrow, Avro, CSV, JSONEachRow — выбирайте Parquet для аналитических нагрузок (колоночный, сжатый, широко поддерживаемый).
Parquet Row Groups: физическая структура файла Apache Iceberg: каталог и иерархия метаданных

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

Результат: 0 из 0
Прикладной
Вопрос 1 из 4. Аналитик выполняет ad-hoc запрос для исследования данных в S3-bucket: SELECT count() FROM s3(...) без намерения повторно обращаться к этому пути. Он также создал S3 engine таблицу archive_table поверх того же пути для регулярных отчётов. В чём ключевое функциональное различие между этими двумя подходами?

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

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

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

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