Перейти к основному содержанию
Предоставляет интерфейс, подобный таблице, для выборки/вставки файлов в Amazon S3 и Google Cloud Storage. Эта табличная функция похожа на функцию hdfs, но предоставляет возможности, специфичные для S3. Если в вашем кластере несколько реплик, вместо этого можно использовать функцию s3Cluster, чтобы распараллелить вставку. При использовании s3 table function с INSERT INTO...SELECT данные считываются и вставляются в потоковом режиме. В памяти одновременно находится лишь несколько блоков данных, пока они непрерывно считываются из S3 и записываются в целевую таблицу.

Синтаксис

GCSТабличная функция S3 интегрируется с Google Cloud Storage через XML API GCS и HMAC-ключи. Подробнее о конечной точке и HMAC см. в документации Google по совместимости.Для GCS подставьте свои HMAC-ключ и HMAC-секрет там, где указаны access_key_id и secret_access_key.
Параметры Табличная функция s3 поддерживает следующие простые параметры:
GCSURL GCS имеет следующий формат, так как конечная точка Google XML API отличается от JSON API:
а не https://storage.cloud.google.com.
Аргументы также можно передавать с помощью именованных коллекций. В этом случае url, access_key_id, secret_access_key, format, structure, compression_method работают так же, и поддерживаются некоторые дополнительные параметры:

Возвращаемое значение

Таблица с указанной структурой для чтения данных из указанного файла или записи данных в него.

Примеры

Выбор первых 5 строк из таблицы в файле S3 https://datasets-documentation.s3.eu-west-3.amazonaws.com/aapl_stock.csv:
ClickHouse использует расширения файлов, чтобы определить формат данных. Например, предыдущую команду можно было выполнить и без CSVWithNames:
ClickHouse также может определить метод сжатия файла. Например, если файл сжат и имеет расширение .csv.gz, ClickHouse автоматически его распакует.
Файлы Parquet с именами вроде *.parquet.snappy или *.parquet.zstd могут сбить ClickHouse с толку и вызвать ошибки TOO_LARGE_COMPRESSED_BLOCK или ZSTD_DECODER_FAILED. Это связано с тем, что ClickHouse попытается прочитать весь файл как данные, сжатые Snappy или ZSTD, хотя в Parquet сжатие применяется на уровне групп строк и столбцов.Метаданные Parquet уже содержат информацию о сжатии для каждого столбца, поэтому расширение файла здесь избыточно. В таких случаях можно просто использовать compression_method = 'none':

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

Предположим, что на S3 у нас есть несколько файлов со следующими URI: Подсчитайте количество строк в файлах, названия которых оканчиваются на числа от 1 до 3:
Подсчитайте общее количество строк во всех файлах в этих двух каталогах:
Если в списке файлов есть диапазоны чисел с ведущими нулями, используйте конструкцию с фигурными скобками для каждой цифры отдельно или символ ?.
Подсчитайте общее количество строк в файлах с именами file-000.csv, file-001.csv, … , file-999.csv:
Вставьте данные в файл test-data.csv.gz:
Вставьте данные из существующей таблицы в файл test-data.csv.gz:
Glob ** можно использовать для рекурсивного обхода каталогов. Рассмотрим пример ниже — он рекурсивно извлечёт все файлы из каталога my-test-bucket-768:
Следующий запрос рекурсивно извлекает данные из всех файлов test-data.csv.gz в любой папке внутри каталога my-test-bucket:
Примечание. В конфигурационном файле сервера можно указать пользовательские URL-маппер. Пример:
URL 's3://clickhouse-public-datasets/my-test-bucket-768/**/test-data.csv.gz' будет преобразован в 'http://clickhouse-public-datasets.s3.amazonaws.com/my-test-bucket-768/**/test-data.csv.gz' Пользовательский маппер можно добавить в config.xml:
Для использования в производственной среде рекомендуется использовать именованные коллекции. Вот пример:

Запись с партиционированием

Стратегия партиционирования

Поддерживается только для запросов INSERT. wildcard: заменяет подстановочный шаблон {_partition_id} в пути к файлу на фактическое значение ключа партиционирования. Выбирается по умолчанию только при значении compatibility ниже 26.6; в противном случае значением по умолчанию является hive (см. настройку file_like_engine_default_partition_strategy). hive реализует секционирование в стиле Hive для чтения и записи. Файлы создаются в следующем формате: <prefix>/<key1=val1/key2=val2...>/<snowflakeid>.<toLower(file_format)>. Пример стратегии партиционирования hive
Примеры стратегии партиционирования wildcard
  1. Использование идентификатора партиции в ключе создаёт отдельные файлы:
В результате данные записываются в три файла: file_x.csv, file_y.csv и file_z.csv.
  1. Использование идентификатора партиции в имени бакета приводит к созданию файлов в разных бакетах:
В результате данные записываются в три файла в разных бакетах: my_bucket_1/file.csv, my_bucket_10/file.csv и my_bucket_20/file.csv.

Доступ к публичным бакетам

ClickHouse пытается получить учетные данные из самых разных источников. Иногда это может вызывать проблемы при доступе к некоторым публичным бакетам, из-за чего клиент возвращает ошибку с кодом 403. Этой проблемы можно избежать, используя ключевое слово NOSIGN, которое заставляет клиент игнорировать все учетные данные и не подписывать запросы.

Использование учетных данных S3 (ClickHouse Cloud)

Для закрытых бакетов можно передать в функцию aws_access_key_id и aws_secret_access_key. Например:
Это подходит для разового доступа или для случаев, когда учётные данные можно легко сменить. Однако в качестве долгосрочного решения для регулярного доступа или при работе с конфиденциальными учётными данными это не рекомендуется. В таких случаях мы рекомендуем использовать ролевой доступ. Ролевой доступ к S3 в ClickHouse Cloud описан здесь. После настройки roleARN можно передать в функцию s3 через параметр extra_credentials. Например:
Необязательный external_id также можно указать вместе с role_arn. Он передаётся как параметр ExternalId в вызове AWS STS AssumeRole и позволяет политике доверия роли требовать общий секрет, что снижает риск проблемы «confused deputy». Например:
Другие примеры можно найти здесь

Работа с архивами

Предположим, что у нас есть несколько архивных файлов со следующими URI в S3: Извлечь данные из этих архивов можно с помощью ::. Глоб-шаблоны можно использовать как в части URL, так и в части после :: (которая отвечает за имя файла внутри архива).
ClickHouse поддерживает три формата архивов: ZIP TAR 7Z Хотя к архивам ZIP и TAR можно обращаться из любого поддерживаемого хранилища, архивы 7Z можно читать только из локальной файловой системы, где установлен ClickHouse.

Вставка данных

Обратите внимание: строки можно вставлять только в новые файлы. Циклы слияния и операции разбиения файлов не поддерживаются. После записи файла все последующие вставки завершатся ошибкой. Подробнее см. здесь.

Виртуальные столбцы

  • _path — Путь к файлу. Тип: LowCardinality(String). Для архива показывает путь в формате: "{path_to_archive}::{path_to_file_inside_archive}"
  • _file — Имя файла. Тип: LowCardinality(String). Для архива показывает имя файла внутри архива.
  • _size — Размер файла в байтах. Тип: Nullable(UInt64). Если размер файла неизвестен, значение — NULL. Для архива показывает несжатый размер файла внутри архива.
  • _time — Время последнего изменения файла. Тип: Nullable(DateTime). Если время неизвестно, значение — NULL.

Настройка use_hive_partitioning

Это указание для ClickHouse разбирать при чтении файлы, разбитые на секции в стиле Hive. На запись оно не влияет. Для симметричного чтения и записи используйте аргумент partition_strategy. Если для настройки use_hive_partitioning установлено значение 1, ClickHouse будет распознавать секционирование в стиле Hive в пути (/name=value/) и позволит использовать столбцы партиции в запросе как виртуальные столбцы. Эти виртуальные столбцы будут иметь те же имена, что и в пути с партициями. Пример

Доступ к requester-pays бакетам

Чтобы получить доступ к requester-pays бакету, во все запросы необходимо добавлять заголовок x-amz-request-payer = requester. Для этого в функцию s3 передаётся параметр headers('x-amz-request-payer' = 'requester'). Например:

Настройки хранилища

  • s3_truncate_on_insert - позволяет очищать файл перед вставкой в него. По умолчанию отключено.
  • s3_create_new_file_on_insert - позволяет создавать новый файл при каждой вставке, если формат имеет суффикс. По умолчанию отключено.
  • s3_skip_empty_files - позволяет пропускать пустые файлы при чтении. По умолчанию включено.

Вложенные схемы Avro

При чтении файлов Avro, содержащих вложенные записи, которые различаются от файла к файлу (например, в некоторых файлах внутри вложенного объекта есть дополнительное поле), ClickHouse может вернуть ошибку вида:
Количество листьев в записи не соответствует количеству элементов в кортеже…
Это происходит потому, что ClickHouse ожидает, что структуры всех вложенных записей будут соответствовать одной и той же схеме. Чтобы обработать такой сценарий, можно:
  • Использовать schema_inference_mode='union' для объединения разных схем вложенных записей, или
  • Вручную привести вложенные структуры к одному виду и включить use_structure_from_insertion_table_in_table_functions=1.
Примечание о производительностиschema_inference_mode='union' может работать медленнее на очень больших наборах данных в S3, поскольку для определения схемы нужно просканировать каждый файл.
Пример
Последнее изменение 2 июля 2026 г.