s3 table function 配合 INSERT INTO...SELECT 时,数据会以流式方式读取并插入。内存中只会保留少量数据块,同时这些块会持续从 S3 读取并写入目标表。
语法
s3 表函数支持以下普通参数:
| Parameter | Description |
|---|---|
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 IDs 作为文件名,以文件格式作为扩展名。默认值为 WILDCARD |
partition_columns_in_data_file | 此参数可选。仅与 HIVE 分区策略配合使用。用于告知 ClickHouse 是否应预期分区列会写入数据文件。默认值为 false。 |
extra_credentials | 此参数可选。用于在 ClickHouse Cloud 中传递基于角色访问所需的 role_arn。配置步骤请参见 Secure S3。 |
storage_class_name | 此参数可选。支持的值为:STANDARD 或 INTELLIGENT_TIERING。可用于指定 AWS S3 Intelligent Tiering。默认值为 STANDARD。 |
参数也可以通过命名集合传递。在这种情况下,
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 对应的表中选择前 5 行:
ClickHouse 会根据文件扩展名判断数据格式。例如,上一条命令其实也可以不显式指定 ClickHouse 也能判断文件的压缩方法。例如,如果文件以
CSVWithNames:.csv.gz 为扩展名,ClickHouse 会自动将其解压。文件名类似
*.parquet.snappy 或 *.parquet.zstd 的 Parquet 文件可能会让 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 目录中的所有文件:
my-test-bucket 目录内所有子文件夹中的 test-data.csv.gz 文件获取数据:
'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} 通配符替换为实际分区键。
HIVE 对读写操作采用 Hive 风格分区。它会按以下格式生成文件:<prefix>/<key1=val1/key2=val2...>/<snowflakeid>.<toLower(file_format)>。
HIVE 分区策略示例
WILDCARD 分区策略示例
- 在键名中使用分区 ID 会创建单独的文件:
file_x.csv、file_y.csv 和 file_z.csv。
- 如果在存储桶名称中使用分区 ID,就会在不同的存储桶中创建文件:
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。例如:
extra_credentials 参数将 roleARN 传递给 s3 函数。例如:
处理归档文件
- ‘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— 文件路径。Type:LowCardinality(String)。如果是归档文件,则按以下格式显示路径:"{path_to_archive}::{path_to_file_inside_archive}"_file— 文件名。Type:LowCardinality(String)。如果是归档文件,则显示归档内文件的名称。_size— 文件大小 (以字节为单位) 。Type:Nullable(UInt64)。如果文件大小未知,则值为NULL。如果是归档文件,则显示归档内文件的未压缩大小。_time— 文件的最后修改时间。Type:Nullable(DateTime)。如果时间未知,则值为NULL。
use_hive_partitioning 设置
partition_strategy 参数。
当 use_hive_partitioning 设置为 1 时,ClickHouse 会检测路径中的 Hive 风格分区 (/name=value/) ,并允许在查询中将分区列作为虚拟列使用。这些虚拟列将与分区路径中的名称相同。
示例
访问请求方付费桶
x-amz-request-payer = requester。这可以通过向 s3 函数传入参数 headers('x-amz-request-payer' = 'requester') 来实现。例如:
存储设置
- s3_truncate_on_insert - 允许在插入前先截断文件。默认禁用。
- s3_create_new_file_on_insert - 如果 format 带有后缀,则允许在每次插入时创建新文件。默认禁用。
- s3_skip_empty_files - 允许在读取时跳过空文件。默认启用。
嵌套 Avro schema
record 中叶子节点的数量与 tuple 中元素数量不匹配…这是因为 ClickHouse 要求所有嵌套记录结构都匹配同一个 schema。 要处理这种情况,可以:
- 使用
schema_inference_mode='union'合并不同的嵌套记录 schema,或 - 手动对齐嵌套结构,并启用
use_structure_from_insertion_table_in_table_functions=1。
性能说明
schema_inference_mode='union' 在非常大的 S3 数据集上可能需要更长时间,因为它必须扫描每个文件来推断 schema。