本文介绍如何通过持久化外表和一次性查询的方式将 S3/TOS 外表中的数据导入 ByteHouse CDW。
ByteHouse 云数仓版 (CDW) 提供了三种从 S3/TOS 外表中导入数据的方式:
导入方式 | 持久化外表 | CnchS3 函数 |
|
|---|---|---|---|
导入步骤 |
| 通过 | 通过 |
操作逻辑 | 通过 | 直接读取文件进行导入,不具备负载均衡机制。 | |
使用场景 |
|
|
|
ByteHouse CDW 支持的文件类型及压缩格式说明如下:
CSV 、TSVWithNames、TSV、CSVWithNames、JSONEachRow、Parquet、ORC 等常用数据类型。none、gzip、deflate、br、xz、zstd、snappy 压缩格式。在开始操作前,请确保您已经具备以下必要的权限和信息:
https://tos-{REGION}.volces.com/xxx 无法直接使用,需要将域名更换为 S3 Endpoint 域名,修改为https://tos-s3-{REGION}.volces.com/xxx格式,详情参见火山引擎 TOS 支持的地域和访问域名。本节介绍通过 S3 外表、CncnS3 函数、INSERT INFILE 导入数据使用的基本语法,便于您理解核心语句的功能和其中参数的使用方法。如需了解具体使用示例,可参考操作步骤章节。
# 创建 ByteHouse 目标表 CREATE TABLE [db_name.]table_name ( column1 type1, column2 type2, column3 type3, ... ) ENGINE=CnchMergeTree; # 创建 ByteHouse 目标表对应的 S3 外表 CREATE TABLE [db_name.]table_name_s3 AS table_name ENGINE=CnchS3( 'http://....' or 'https://', 'FORMAT', 'COMPRESSION', 'access_key_id', 'secret_access_key' );
参数说明
参数名 | 是否必填 | 描述 |
|---|---|---|
| 否 | 指定表所在的数据库名称。如果您在创建表前,执行了 |
| 是 | 指定 ByteHouse 目标表的表名。填写示例: |
| 是 | 指定 ByteHouse 目标表对应的 S3 外表的表名。 |
| 是 | 指定 ByteHouse 目标表表结构,包括列名和列类型。填写示例: |
| 是 | 指定表的表引擎。
|
| 是 | 指定 S3 外表对应的对象存储桶的路径,支持 HTTP(S) 格式的 URL。
|
| 是 | 指定 S3 外表的文件格式,请根据您的文件格式填写。ByteHouse 当前支持的格式请参见功能概述部分的介绍。 |
| 是 | 指定 S3 外表的压缩格式,ByteHouse 当前支持的格式请参见功能概述部分的介绍。
|
| 是 | 指定 S3 外表使用的对象存储服务的 Access Key ID,您可参考您使用的对象存储服务的官方文档获取 Access Key ID。如果您使用的是火山引擎 TOS,可参考 Access Key(密钥)管理。 |
| 是 | 指定 S3 外表使用的对象存储服务的 Secret Access Key,您可参考您使用的对象存储服务的官方文档获取 Secret Access Key。如果您使用的是火山引擎 TOS,可参考 Access Key(密钥)管理。 |
如需向 S3 外表导入多个文件的数据源,请使用通配符替换对应的 "file_path/file" 路径。例如想导入"/source/"目录下的所有文件,可以写成:
CREATE TABLE db.table_name_s3 ( id String, name String, city String ) ENGINE=CnchS3( 'https://bucket.endpoint/source/*', 'FORMAT', 'COMPRESSION' 'access_key_id', 'secret_access_key' )
说明
更多 S3 外表的用法请参见S3 外表。
INSERT INTO [db_name.]table_name SELECT column1, column2, ... FROM table_name_s3 [WHERE _path like '%{path}%'] [SETTINGS parameter1 = value1, parameter2 = value2, ...]
参数说明
参数名 | 是否必填 | 描述 |
|---|---|---|
| 否 | 指定表所在的数据库名称。如果您在创建表前,执行了 |
| 是 | 指定需导入数据的 ByteHouse 目标表名称。填写示例: |
| 是 | 指定需导入的列名,需与 S3 外表的列名保持一致。填写示例: |
| 是 | 指定 S3 外表名或子查询。 |
| 否 |
例如,在查询的时写上: |
| 否 | 自定义参数,您可按需设置以下超时参数:
|
INSERT INTO [db_name.]table_name SELECT column1, column2, ... FROM CnchS3( 'http://....' or 'https://', 'column1 type1, column2 type2, ...', 'format', 'compression', 'access_key_id', 'secret_access_key' ) [WHERE _path like '%{path}%'] [SETTINGS parameter1 = value1, parameter2 = value2, ...]
参数说明
参数名 | 是否必填 | 描述 |
|---|---|---|
| 否 | 指定表所在的数据库名称。如果您在创建表前,执行了 |
| 是 | 指定需导入数据的 ByteHouse 表名称。 |
| 是 | 选择需导入的字段列名,需与源表的列名保持一致。 |
| 是 | 表示使用 CnchS3 函数导入数据。 |
| 是 | 指定对象存储中源表的路径,可以是 HTTP(S) 格式的 URL。
|
| 是 | 指定源表中需导入至目标表的表结构,包括列名和列类型。示例: |
| 是 | 指定源表数据的文件格式,请根据您的文件格式填写。ByteHouse 当前支持的格式请参见功能概述部分的介绍。 |
| 是 | 指定数据的压缩格式,ByteHouse 当前支持的格式请参见功能概述部分的介绍。
|
| 是 | 对象存储服务的 Access Key ID,您可参考您使用的对象存储服务的官方文档获取 Access Key ID。如果您使用的是火山引擎 TOS,可参考 Access Key(密钥)管理。 |
| 对象存储服务的 Secret Access Key,您可参考您使用的对象存储服务的官方文档获取 Secret Access Key。如果您使用的是火山引擎 TOS,可参考 Access Key(密钥)管理。 | |
| 否 |
例如在查询的时写上: |
| 否 | 自定义参数,您可按需设置以下超时参数:
|
INSERT INTO [db_name.]table_name FORMAT data_format INFILE 'object_storage_path' COMPRESSION 'compression_format' SETTINGS s3_ak_id = 's3_ak', s3_ak_secret = 's3_sk', s3_region = 's3_region', s3_endpoint= 's3_endpoint', s3_use_virtual_hosted_style=1;
参数说明
参数名 | 是否必填 | 描述 |
|---|---|---|
| 否 | 可选,指定 ByteHouse 目标表所在的数据库。如果您在创建表前,执行了 |
| 是 | 指定需导入数据的 ByteHouse 目标表名称。填写示例: |
| 是 | 设置文件格式,请根据您的文件格式填写。ByteHouse 当前支持的格式请参见功能概述部分的介绍。 |
| 是 | 指定对象存储中的源文件,填写示例: |
| 是 | 设置压缩格式。ByteHouse 当前支持的压缩格式请参见功能概述部分的介绍。
|
| 是 | 设置对象存储服务的连接信息:
|
您可通过登录 ByteHouse 云数仓版控制台,使用 ByteHouse CLI 工具,或使用数据库客户端工具(如 DBeaver、DataGrip 或命令行工具)连接到 ByteHouse。操作详情可参考以下说明或文档:
执行以下 SQL 语句,选择目标数据库。
USE demo_db;
在 ByteHouse 中创建目标表,与源表保持相同的表结构,示例如下:
CREATE TABLE demo_db.demo_table ( id String, name String, city String, ) ENGINE = CnchMergeTree ORDER BY id
通过执行以下 SQL 创建 ByteHouse 目标表对应的 S3 外表。使用时,请使用实际参数值替换命令中的占位符。
CREATE TABLE demo_db.demo_table_s3 AS demo_db.demo_table ENGINE=CnchS3( 'https://bucket.endpoint/file_path/file', 'CSV', -- 替换为您实际导入文件的格式 'none', -- 替换为您需要的压缩格式 'access_key_id', 'secret_access_key' )
请参考如下 SQL 直接从已经建好的表导入数据到 ByteHouse 表中。参数说明请参见通过创建 S3 外表导入数据。
INSERT INTO demo_db.demo_table SELECT col0, col1, ... FROM demo_db.demo_table_s3 WHERE _path like '%{path}%' SETTINGS receive_timeout = 10800000, max_execution_time = 10800000, exchange_timeout = 10800000, send_timeout = 10800000;
执行以下 SQL 语句,使用 S3 表函数将数据从对象存储导入到 ByteHouse 表中。使用时,请使用实际参数值替换命令中的占位符。参数说明请参见通过 CnchS3 函数导入数据。
INSERT INTO demo_db.demo_table SELECT col0, col1... FROM CnchS3( 'https://bucket.endpoint/file_path/test_outfile.csv', 'id String, name String, city String', 'FORMAT CSV', -- 替换为您实际导入文件的格式 'COMPRESSION none' -- 替换为您需要的压缩格式 '{your_access_key_id}', '{your_secret_access_key}' ) WHERE _path like '%{path}%' SETTINGS receive_timeout = 10800000, max_execution_time = 10800000, exchange_timeout = 10800000, send_timeout = 10800000;
执行以下 SQL 语句,将数据从对象存储桶导入到 ByteHouse 表中。使用时,请使用实际参数值替换命令中的占位符。参数说明请参见通过 INSERT INFILE 子句导入数据。
INSERT INTO demo_db.demo_table FORMAT CSV INFILE 's3://s3_bucket/test_outfile.csv' COMPRESSION 'none' -- 替换为您实际导入文件的格式和所需的压缩格式 SETTINGS s3_ak_id = '{your_access_key_id}', s3_ak_secret = '{your_secret_access_key}', s3_region = '{your_s3_region}', s3_endpoint= '{your_s3_endpoint}', s3_use_virtual_hosted_style=1;
执行导入操作后,可以通过查询目标表来验证数据是否正确导入。示例如下:
SELECT * FROM demo_db.demo_table LIMIT 10;
完成上述步骤,即可将数据从对象存储桶导入到 ByteHouse 表中。如有问题,可联系系统管理员或数据库管理员获取支持。
导入数据时,ByteHouse 支持对最后一层路径进行字符串正则匹配,从而允许批量指定文件。目前支持以下几种用法:
/* 解析一个字符串,该字符串用于生成分片(shards)和副本(replicas)。分隔符是 | 或 , 这两个字符中的一个, * 具体使用取决于生成的是分片还是副本。 * 例如: * host1,host2,... - 生成由 host1, host2, ... 组成的分片集合。 * host1|host2|... - 生成由 host1, host2, ... 组成的副本集合。 * abc{8..10}def - 生成分片集合:abc8def, abc9def, abc10def。 * abc{08..10}def - 生成分片集合:abc08def, abc09def, abc10def。 * abc{x,yy,z}def - 生成分片集合:abcxdef, abcyydef, abczdef。 * abc{x|yy|z} def - 生成副本集合:abcxdef, abcyydef, abczdef。 * abc{1..9}de{f,g,h} - 是笛卡尔积(直积),生成 27 个分片。 * abc{1..9}de{0|1} - 是笛卡尔积(直积),生成 9 个分片,每个分片包含 2 个副本。 */
使用示例如下:
INSERT INTO numbers FORMAT CSV INFILE 's3://bucket/data_path/clickhouse_outfile_{1..100}.csv'
除了这种纯正则的解析,目前已经支持在 Local/S3 文件系统内 ListFile,支持 */ ? 等通配符匹配。
INSERT INTO numbers FORMAT CSV INFILE 's3://bucket/data_path/clickhouse_outfile_*.csv'