s3 table function с INSERT INTO...SELECT данные считываются и вставляются в потоковом режиме. В памяти одновременно находится лишь несколько блоков данных, пока они непрерывно считываются из S3 и записываются в целевую таблицу.
Синтаксис
s3 поддерживает следующие простые параметры:
GCSURL GCS имеет следующий формат, так как конечная точка Google XML API отличается от JSON API:а не https://storage.cloud.google.com.
url, access_key_id, secret_access_key, format, structure, compression_method работают так же, и поддерживаются некоторые дополнительные параметры:
Возвращаемое значение
Примеры
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} в пути к файлу на фактическое значение ключа партиционирования. Выбирается по умолчанию только при значении compatibility ниже 26.6; в противном случае значением по умолчанию является hive (см. настройку file_like_engine_default_partition_strategy).
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. Например:
external_id также можно указать вместе с role_arn. Он передаётся как параметр ExternalId в вызове AWS STS AssumeRole и позволяет политике доверия роли требовать общий секрет, что снижает риск проблемы «confused deputy». Например:
Работа с архивами
- ‘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, поскольку для определения схемы нужно просканировать каждый файл.