ByteHouse 研发的 CnchS3 引擎集成了对象存储,支持通过 ByteHouse 管理存储在 S3 兼容对象存储上的数据。本文将介绍如何在 ByteHouse 云数仓版中使用 S3 外表。
ByteHouse 借助 CnchS3 引擎实现与 S3 兼容对象存储的对接,无需将数据迁移至 ByteHouse 内部,即可对对象存储上的原始数据执行查询、写入等操作。ByteHouse 提供了两种使用方式:CnchS3 表引擎(持久化外表)和 CnchS3 表函数,您可根据业务场景灵活选择。
CnchS3 表引擎和 CnchS3 表函数两种方式对比如下:
方式 | 适用场景 |
|---|---|
CnchS3 表引擎 |
|
CnchS3 表函数 |
|
外部表的功能旨在提供除 ByteHouse 内部表以外的其他数据的处理能力。通过一条简单的 DDL 语句,即可在 ByteHouse 上创建一张外部表,建立 ByteHouse 表与外部数据源的关联。
在开始操作前,请确保您已经具备您使用的对象存储桶的访问权限:
https://tos-{REGION}.volces.com/xxx 无法直接使用,需要将域名更换为 S3 Endpoint 域名,修改为https://tos-s3-{REGION}.volces.com/xxx格式,详情参见火山引擎 TOS 支持的地域和访问域名。语法
CREATE TABLE [db_name.]table_name ( column1 type1, column2 type2, ... ) ENGINE=CnchS3( 'http://....' or 'https://' or 's3://', '[FORMAT]', '[COMPRESSION]', 'access_key_id', 'secret_access_key' );
参数名 | 是否必填 | 描述 |
|---|---|---|
| 否 | 指定表所在的数据库名称。如果您在创建表前,执行了 |
| 是 | 指定 S3 外表的表名。填写示例: |
| 是 | 指定 S3 外表的表结构,包括列名和列类型。填写示例: |
| 是 | 表引擎指定为 CnchS3。 |
| 是 | 指定 S3 外表对应的对象存储桶的路径。路径说明如下:
|
| 是 | 指定 S3 外表的文件格式,请根据您的文件格式填写。ByteHouse 当前支持的格式请参见相关参考:CnchS3 表引擎支持的文件格式。 |
| 是 | 指定 S3 外表的压缩格式,当前支持 gzip/zstd/lz4/snappy/bzip2/xz/brotli 压缩格式,也支持设置为 none。不指定时,系统将从文件后缀中推测。 |
| 是 | 指定 S3 外表使用的对象存储服务的 Access Key ID,您可参考您使用的对象存储服务的官方文档获取 Access Key ID。如果您使用的是火山引擎 TOS,可参考 Access Key(密钥)管理。 |
| 是 | 指定 S3 外表使用的对象存储服务的 Secret Access Key,您可参考您使用的对象存储服务的官方文档获取 Secret Access Key。如果您使用的是火山引擎 TOS,可参考 Access Key(密钥)管理。 |
示例
创建单文件表
CREATE TABLE s3_engine_table(name String, value UInt32) ENGINE = CnchS3( 'https://bucket.endpoint/file_path/fileSample.csv', 'CSV', 'none', 'access_key_id', 'secret_access_key' );
使用通配符创建多文件表
CREATE TABLE s3_engine_table_glob_uri(name String, value UInt32) ENGINE = CnchS3( 'https://bucket.endpoint/file_path/fileSample*.csv', 'CSV', 'none', 'access_key_id', 'secret_access_key' );
您可通过 INSERT INTO 语句向 S3 外表写入数据,用法与普通表的写入操作一致。
示例如下:
INSERT INTO s3_engine_table VALUES ('one', 1), ('two', 2), ('three', 3);
您可通过 SELECT 语句查询 S3 外表中的数据,用法与普通表的查询操作一致。ByteHouse 也支持通过 _path和_file 列进行剪枝查询。示例如下:
查询数据
SELECT * FROM s3_engine_table;
使用 _file 列进行剪枝查询
SELECT * FROM s3_engine_table_glob_uri WHERE _file = 'fileSample.csv';
默认情况下,外表的 resources_assign_type **** 值为 server_push,在该模式下,数据文件会被发往 Worker 进行查询。如果您想在 Server 本地查询,可以修改 resources_assign_type 为 server_local。
ALTER TABLE s3_engine_table MODIFY SETTING resources_assign_type='server_local'
您可通过 SELECT 语句更新 AK/SK。
SELECT * FROM s3_engine_table SETTINGS s3_access_key_id = 'your_new_ak', s3_access_key_secret = 'your_new_sk'
语法
INSERT INTO FUNCTION CnchS3( 'http://....' or 'https://', 'column1 type1, column2 type2, ...', 'FORMAT', 'COMPRESSION', 'access_key_id', 'secret_access_key' ) VALUES (value1_1, value1_2, ...), (value2_1, value2_2, ...), (...);
参数名 | 是否必填 | 描述 |
|---|---|---|
FUNCTION | 是 | 表函数指定为 CnchS3。 |
| 是 | 指定对象存储中源表的路径。
|
| 是 | 指定需要写入数据的目标列和列类型。示例: |
| 是 | 指定源表数据的文件格式,请根据您的文件格式填写。ByteHouse 当前支持的格式请参见相关参考:CnchS3 表引擎支持的文件格式。 |
| 是 | 指定 S3 外表的压缩格式,当前支持 gzip/zstd/lz4/snappy/bzip2/xz/brotli 压缩格式,也支持设置为 none。不指定时,系统将从文件后缀中推测。 |
| 是 | 对象存储服务的 Access Key ID,您可参考您使用的对象存储服务的官方文档获取 Access Key ID。如果您使用的是火山引擎 TOS,可参考 Access Key(密钥)管理。 |
| 是 | 对象存储服务的 Secret Access Key,您可参考您使用的对象存储服务的官方文档获取 Secret Access Key。如果您使用的是火山引擎 TOS,可参考 Access Key(密钥)管理。 |
| 是 | 指定需写入的数据。 |
示例
INSERT INTO FUNCTION CnchS3( 'http://bucket_endpoint/bucket/normal_write.csv', 'name String, id String', 'CSV', 'none', 'your_access_key_id', 'your_secret_access_key' ) VALUES ('one', '1'), ('two', '2'), ('three', '3');
分区级写入数据的语法与普通写入数据一致,但需在对象存储路径中包含 '{_partition_id}' 字段,其他参数请参考上文参数说明。
示例如下:
INSERT INTO FUNCTION CnchS3( 'http://bucket_endpoint/bucket/{_partition_id}_partition_write.csv', 'name String, id String', 'CSV', 'none', 'your_access_key_id', 'your_secret_access_key' ) PARTITION BY name VALUES ('one', '1'), ('one', '2'), ('two', '1'), ('two', '2');
使用 CnchS3 函数直接查询 S3 外表。
语法
SELECT * FROM CnchS3( ''http://....' or 'https://', 'column1 type1, column2 type2, ...', '[FORMAT]', '[COMPRESSION]', 'access_key_id', 'secret_access_key' ) [WHERE where_clause];
参数 | 是否必填 | 配置说明 |
|---|---|---|
| 是 | 表函数指定为 CnchS3。 |
| 是 | 指定对象存储中源表的路径。
|
| 是 | 指定 S3 外表的表结构,需与源表保持一致,包括列名和列类型。填写示例: |
| 否 | 可选配置。指定 S3 外表的文件格式,请根据您的文件格式填写。当前 CnchS3 支持的文件格式请参见相关参考:CnchS3 表引擎支持的文件格式。 |
| 否 | 可选配置。当前支持 gzip/zstd/lz4/snappy/bzip2/xz/brotli 压缩格式,也支持设置为 none。不指定时,系统将从文件后缀中推测。 |
| 否 | 指定筛选条件。ByteHouse S3 外表支持通过 |
示例
查询单份文件
SELECT * FROM CnchS3( 'http://bucket_endpoint/bucket/fileSample.csv', 'city String, name String', 'CSV', 'none', 'your_access_key_id', 'your_secret_access_key' );
使用通配符查询多份文件,并进行剪枝查询
SELECT * FROM CnchS3( 'http://bucket_endpoint/bucket/fileSample.csv', 'city String, name String', 'CSV', 'none', 'your_access_key_id', 'your_secret_access_key' ) WHERE _path LIKE '%test%';
文件格式 | Read | Write |
|---|---|---|
✅ | ✅ | |
✅ | ❌ | |
✅ | ✅ | |
✅ | ❌ | |
✅ | ✅ | |
✅ | ✅ | |
✅ | ❌ | |
❌ | ✅ | |
❌ | ✅ | |
✅ | ✅ | |
❌ | ✅ | |
✅ | ✅ | |
❌ | ✅ | |
❌ | ✅ | |
❌ | ✅ | |
❌ | ✅ | |
❌ | ✅ | |
❌ | ✅ | |
✅ | ✅ | |
✅ | ✅ | |
✅ | ✅ | |
✅ | ✅ | |
✅ | ✅ | |
❌ | ✅ | |
✅ | ❌ |