s3 table function с INSERT INTO...SELECT данные считываются и вставляются в потоковом режиме. В памяти одновременно находится лишь несколько блоков данных, пока они непрерывно считываются из S3 и записываются в целевую таблицу.
Синтаксис
s3 поддерживает следующие простые параметры:
| Параметр | Описание |
|---|---|
url | URL бакета с путём к файлу. В режиме только для чтения поддерживаются следующие подстановочные шаблоны: *, **, ?, {abc,def} и {N..M}, где N, M — числа, 'abc', 'def' — строки. Подробнее см. здесь. |
NOSIGN | Если указать это ключевое слово вместо учетных данных, запросы не будут подписываться. |
access_key_id and secret_access_key | Ключи, задающие учетные данные для использования с указанной конечной точкой. Необязательно. |
session_token | Токен сеанса для использования с указанными ключами. Необязателен при передаче ключей. |
format | Формат файла. |
structure | Структура таблицы. Формат: 'column1_name column1_type, column2_name column2_type, ...'. |
compression_method | Параметр необязателен. Поддерживаемые значения: none, gzip или gz, brotli или br, xz или LZMA, zstd или zst. По умолчанию метод сжатия определяется автоматически по расширению файла. |
headers | Параметр необязателен. Позволяет передавать заголовки в запросе S3. Передавайте в формате headers(key=value), например headers('x-amz-request-payer' = 'requester'). |
partition_strategy | Параметр необязателен. Поддерживаемые значения: WILDCARD или HIVE. Для WILDCARD в пути требуется {_partition_id}, который заменяется ключом партиционирования. HIVE не допускает подстановочные шаблоны, предполагает, что путь является корнем таблицы, и создаёт директории с партициями в стиле Hive, где в качестве имён файлов используются Snowflake ID, а в качестве расширения — формат файла. По умолчанию WILDCARD |
partition_columns_in_data_file | Параметр необязателен. Используется только со стратегией партиционирования HIVE. Указывает ClickHouse, следует ли ожидать, что столбцы партиции будут записаны в файл данных. Значение по умолчанию — false. |
extra_credentials | Параметр необязателен. Используется для передачи role_arn для ролевого доступа в ClickHouse Cloud. Шаги настройки см. в Secure S3. |
storage_class_name | Параметр необязателен. Поддерживаемые значения: STANDARD или INTELLIGENT_TIERING. Позволяет указать AWS S3 Intelligent Tiering. По умолчанию — STANDARD. |
GCSURL GCS имеет следующий формат, так как конечная точка Google XML API отличается от JSON API:а не https://storage.cloud.google.com.
url, access_key_id, secret_access_key, format, structure, compression_method работают так же, и поддерживаются некоторые дополнительные параметры:
| Аргумент | Описание |
|---|---|
filename | добавляется к URL, если указан. |
use_environment_credentials | включен по умолчанию; позволяет передавать дополнительные параметры через переменные окружения AWS_CONTAINER_CREDENTIALS_RELATIVE_URI, AWS_CONTAINER_CREDENTIALS_FULL_URI, AWS_CONTAINER_AUTHORIZATION_TOKEN, AWS_EC2_METADATA_DISABLED. |
no_sign_request | по умолчанию отключен. |
expiration_window_seconds | значение по умолчанию — 120. |
Возвращаемое значение
Примеры
https://datasets-documentation.s3.eu-west-3.amazonaws.com/aapl_stock.csv:
ClickHouse использует расширения файлов, чтобы определить формат данных. Например, предыдущую команду можно было выполнить и без ClickHouse также может определить метод сжатия файла. Например, если файл сжат и имеет расширение
CSVWithNames:.csv.gz, ClickHouse автоматически его распакует.Файлы Parquet с именами вроде
*.parquet.snappy или *.parquet.zstd могут сбить ClickHouse с толку и вызвать ошибки TOO_LARGE_COMPRESSED_BLOCK или ZSTD_DECODER_FAILED.
Это связано с тем, что ClickHouse попытается прочитать весь файл как данные, сжатые Snappy или ZSTD, хотя в Parquet сжатие применяется на уровне групп строк и столбцов.Метаданные Parquet уже содержат информацию о сжатии для каждого столбца, поэтому расширение файла здесь избыточно.
В таких случаях можно просто использовать compression_method = 'none':Использование
- ‘https://clickhouse-public-datasets.s3.amazonaws.com/my-test-bucket-768/some_prefix/some_file_1.csv'
- ‘https://clickhouse-public-datasets.s3.amazonaws.com/my-test-bucket-768/some_prefix/some_file_2.csv'
- ‘https://clickhouse-public-datasets.s3.amazonaws.com/my-test-bucket-768/some_prefix/some_file_3.csv'
- ‘https://clickhouse-public-datasets.s3.amazonaws.com/my-test-bucket-768/some_prefix/some_file_4.csv'
- ‘https://clickhouse-public-datasets.s3.amazonaws.com/my-test-bucket-768/another_prefix/some_file_1.csv'
- ‘https://clickhouse-public-datasets.s3.amazonaws.com/my-test-bucket-768/another_prefix/some_file_2.csv'
- ‘https://clickhouse-public-datasets.s3.amazonaws.com/my-test-bucket-768/another_prefix/some_file_3.csv'
- ‘https://clickhouse-public-datasets.s3.amazonaws.com/my-test-bucket-768/another_prefix/some_file_4.csv'
file-000.csv, file-001.csv, … , file-999.csv:
test-data.csv.gz:
test-data.csv.gz:
my-test-bucket-768:
test-data.csv.gz в любой папке внутри каталога my-test-bucket:
'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:
Запись с партиционированием
Стратегия партиционирования
WILDCARD (по умолчанию): заменяет подстановочный шаблон {_partition_id} в пути к файлу на фактическое значение ключа партиционирования.
HIVE реализует секционирование в стиле Hive для чтения и записи. Файлы создаются в следующем формате: <prefix>/<key1=val1/key2=val2...>/<snowflakeid>.<toLower(file_format)>.
Пример стратегии партиционирования HIVE
WILDCARD
- Использование идентификатора партиции в ключе создаёт отдельные файлы:
file_x.csv, file_y.csv и file_z.csv.
- Использование идентификатора партиции в имени бакета приводит к созданию файлов в разных бакетах:
my_bucket_1/file.csv, my_bucket_10/file.csv и my_bucket_20/file.csv.
Доступ к публичным бакетам
403.
Этой проблемы можно избежать, используя ключевое слово NOSIGN, которое заставляет клиент игнорировать все учетные данные и не подписывать запросы.
Использование учетных данных S3 (ClickHouse Cloud)
aws_access_key_id и aws_secret_access_key. Например:
roleARN можно передать в функцию s3 через параметр extra_credentials. Например:
Работа с архивами
- ‘https://s3-us-west-1.amazonaws.com/umbrella-static/top-1m-2018-01-10.csv.zip'
- ‘https://s3-us-west-1.amazonaws.com/umbrella-static/top-1m-2018-01-11.csv.zip'
- ‘https://s3-us-west-1.amazonaws.com/umbrella-static/top-1m-2018-01-12.csv.zip'
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
partition_strategy.
Если для настройки use_hive_partitioning установлено значение 1, ClickHouse будет распознавать секционирование в стиле Hive в пути (/name=value/) и позволит использовать столбцы партиции в запросе как виртуальные столбцы. Эти виртуальные столбцы будут иметь те же имена, что и в пути с партициями.
Пример
Доступ к 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
Количество листьев в записи не соответствует количеству элементов в кортеже…Это происходит потому, что ClickHouse ожидает, что структуры всех вложенных записей будут соответствовать одной и той же схеме. Чтобы обработать такой сценарий, можно:
- Использовать
schema_inference_mode='union'для объединения разных схем вложенных записей, или - Вручную привести вложенные структуры к одному виду и включить
use_structure_from_insertion_table_in_table_functions=1.
Примечание о производительности
schema_inference_mode='union' может работать медленнее на очень больших наборах данных в S3, поскольку для определения схемы нужно просканировать каждый файл.