从OSS导入数据
本文介绍如何将数据从阿里云对象存储OSS(Object Storage Service)导入至云数据库ClickHouse。
前提条件
注意事项
云数据库ClickHouse的云原生版集群不支持从OSS导入数据。
请确保OSS存储空间(Bucket)与您的云数据库ClickHouse集群在同一地域,并使用阿里云VPC网络访问OSS。
步骤一:将测试数据上传至OSS中
准备测试数据,将如下示例数据存储为test.csv。
1,yang,32,shanghai,http://example.com 2,wang,22,beijing,http://example.com 3,xiao,23,shenzhen,http://example.com 4,jess,45,hangzhou,http://example.com 5,jack,14,shanghai,http://example.com 6,tomy,25,hangzhou,http://example.com 7,lucy,45,shanghai,http://example.com 8,tengyin,26,shanghai,http://example.com 9,wangli,27,shenzhen,http://example.com 10,xiaohua,37,shanghai,http://example.com
登录OSS管理控制台。
单击左侧导航栏的Bucket列表。
在Bucket列表页面,单击目标Bucket名称。
在文件管理页签,单击上传文件。
在上传文件页面,上传示例数据集test.csv。
说明详细参数配置,请参见上传文件。
步骤二:在云数据库ClickHouse上创建表
在云数据库ClickHouse上创建表后,将OSS数据导入至云数据库ClickHouse。
在集群列表页面,选择默认实例列表,单击目标集群ID。
单击右上方导航栏的登录数据库。
在登录实例页面,输入数据库账号和数据库密码,单击登录。
创建本地表。
说明云数据库ClickHouse表的结构需与OSS外表的结构一致。
请根据集群的副本配置选择对应的本地表建表语句。您可以在控制台集群信息页面的集群属性区域查看副本配置。
单副本版建表语句
create table oss_test_tbl_local on cluster default ( id UInt8, user_name String, age UInt16, city String, ac cess_url String ) engine = MergeTree() order by id;
双副本版建表语句
create table oss_test_tbl_local on cluster default ( id UInt8, user_name String, age UInt16, city String, access_url String ) engine = ReplicatedMergeTree('/clickhouse/tables/{database}/{table}/{shard}', '{replica}') order by id;
创建分布式表。
说明如果您只需要导入OSS数据至本地表,可跳过此步骤。
create table oss_test_tbl_distributed on cluster default ( id UInt8, user_name String, age UInt16, city String, access_url String ) engine = Distributed(default, default, oss_test_tbl_local, rand());
步骤三:导入OSS数据至云数据库ClickHouse
云数据库ClickHouse提供了表引擎和表函数两种方法导入OSS数据。
方法一:通过表引擎导入OSS数据
创建OSS外表。
说明请根据集群的内核版本选择对应的建表语句。您可以在控制台集群信息页面的集群属性区域查看版本。
21.8及以下版本的建表语法
CREATE TABLE <table_name> [on cluster default] ( 'col_name1' col_type1, 'col_name2' col_type2, ... ) ENGINE = OSS('<oss-endpoint>', '<access-key-id>', '<access-key-secret>', '<oss-file-path>', '<file-format-name>');
22.8版本的建表语法
CREATE TABLE <table_name> [on cluster default] ( 'col_name1' col_type1, 'col_name2' col_type2, ... ) ENGINE = OSS('https://<BucketName>.<oss-endpoint>/<file-name>', '<access-key-id>', '<access-key-secret>', '<file-format-name>');
参数说明如下。
参数名
描述
table_name
表名。
col_name1,col_name2
列名。
col_type1,col_type2
列类型。
重要OSS外表的结构类型需与OSS数据对应。
BucketName
Bucket的名称。
oss-endpoint
ECS的VPC网络访问(内网)的Endpoint。如何获取,请参见访问域名和数据中心。
重要请确保OSS存储空间(Bucket)与您的云数据库ClickHouse集群在同一地域。
file-name
文件名称。
access-key-id
访问OSS数据的Accesskey ID。
access-key-secret
访问OSS数据的AccessKey Secret。
oss-file-path
文件的存储路径。一般格式为oss://<bucket-name>/<path-to-file>。
说明oss-file-path参数支持通过通配符进行模糊匹配。更多信息,请参见通配符模糊匹配OSS的存储路径。
file-format-name
文件的格式,本文为CSV。
示例语句:
21.8及以下版本的示例语句
CREATE TABLE oss_test_tbl on cluster default ( id UInt8, user_name String, age UInt16, city String, access_url String ) ENGINE = OSS('oss-cn-shanghai-internal.aliyuncs.com', 'LTAI5tDVcUKu2CbcBwhr****', 'WAcroHBcL7IVOK8FIHzNJy91Lc****', 'oss://testBucketName/test.csv', 'CSV');
22.8版本的示例语句
CREATE TABLE oss_test_tbl on cluster default ( id UInt8, user_name String, age UInt16, city String, access_url String ) ENGINE = OSS('http://testBucketName.oss-cn-shanghai-internal.aliyuncs.com/test.csv', 'LTAI5tDVcUKu2CbcBwhr****', 'WAcroHBcL7IVOK8FIHzNJy91Lc****','CSV')
将OSS外表数据导入至步骤二创建的分布式表。
insert into oss_test_tbl_distributed select * from oss_test_tbl;
CSV文件默认列分隔符为半角逗号(,),如果您导入的CSV文件为其他列分隔符,需要在导入语句中通过
format_csv_delimiter
指定其他列分隔符。例如CSV文件列与列之间使用竖线分割,则示例语句如下。insert into oss_test_tbl_distributed select * from oss('<oss-endpoint>', '<access-key-id>', '<access-key-secret>', '<oss-file-path>', '<file-format-name>', '<col_name> <col_type>(,...)') settings format_csv_delimiter='|';
方法二:通过表函数导入OSS数据
请根据集群的内核版本选择对应的建表语句。您可以在控制台集群信息页面的集群属性区域查看版本。
21.8及以下版本的导入语法
insert into oss_test_tbl_distributed select * from oss('<oss-endpoint>', '<access-key-id>', '<access-key-secret>', '<oss-file-path>', '<file-format-name>', '<col_name> <col_type>(,...)');
22.8版本的导入语法
insert into oss_test_tbl_distributed select * from oss('https://<BucketName>.<oss-endpoint>/<file-name>','<access-key-id>', '<access-key-secret>', '<file-format-name>', '<col_name> <col_type>(,...)');
参数的详细信息,请参见参数说明。
示例语句:
21.8及以下版本的查询语句
SELECT * FROM oss('oss-cn-shanghai-internal.aliyuncs.com', 'LTAI5tDVcUKu2CbcBwhr****', 'WAcroHBcL7IVOK8FIHzNJy91Lc****', 'oss://testBucketName/test.csv', 'CSV', 'id UInt8, user_name String, age UInt16, city String, access_url String');
22.8版本的查询语句
SELECT * FROM oss('http://testBucketName.oss-cn-shanghai-internal.aliyuncs.com/test.csv', 'LTAI5tDVcUKu2CbcBwhr****', 'WAcroHBcL7IVOK8FIHzNJy91Lc****', 'CSV', 'id UInt8, user_name String, age UInt16, city String, access_url String');
CSV文件默认列分隔符为半角逗号(,),如果您导入的CSV文件为其他列分割符,需要在导入语句中通过format_csv_delimiter
指定其他列分隔符。例如CSV文件列与列之间使用竖线分割,则示例语句如下。
insert into oss_test_tbl_distributed select * from oss('<oss-endpoint>', '<access-key-id>', '<access-key-secret>', '<oss-file-path>', '<file-format-name>', '<col_name> <col_type>(,...)') settings format_csv_delimiter='|';
步骤四:查询导入云数据库ClickHouse的OSS数据
执行查询语句。
如果您导入的是本地表,请将查询语句中的分布式表名更换为本地表名,再进行查询。
select * from oss_test_tbl_distributed;
返回结果:
┌─id─┬─user_name─┬──age──┬───city─────┬─────access_url────────┐
│ 1 │ yang │ 32 │ shanghai │ http://example.com │
│ 2 │ wang │ 22 │ beijing │ http://example.com │
│ 3 │ xiao │ 23 │ shenzhen │ http://example.com │
│ 4 │ jess │ 45 │ hangzhou │ http://example.com │
│ 5 │ jack │ 14 │ shanghai │ http://example.com │
│ 6 │ tomy │ 25 │ hangzhou │ http://example.com │
│ 7 │ lucy │ 45 │ shanghai │ http://example.com │
│ 8 │ tengyin │ 26 │ shanghai │ http://example.com │
│ 9 │ wangli │ 27 │ shenzhen │ http://example.com │
│ 10 │ xiaohua │ 37 │ shanghai │ http://example.com │
└────┴───────────┴───────┴────────────┴───────────────────────┘
通配符模糊匹配OSS的存储路径
OSS中通常存在多个具备相同命名规则的小文件,为了简化对于小文件的分析,oss-file-path
参数支持通过如下通配符进行模糊匹配。
*
:匹配任意文件名、目录名。如/dir/*
匹配/dir
下的所有文件。{x, y, z}
:匹配大括号中的任意一个值。如file_{x,y,z}
匹配file_x
、file_y
或file_z
。{num1..num2}
:匹配[num1,num2]展开后的任意一个值。如file_{1..3}
匹配file_1
、file_2
或file_3
。?
:匹配任意一个单字符。如file_?
匹配file_a
、file_b
、file_c
等等。
示例
上传文件的目录结构如下。
oss://testBucketName/
doc-data/
oss-import/
small_files/
access_log_csv_1.txt
access_log_csv_2.txt
access_log_csv_3.txt
oss-file-path
参数的部分参考取值如下。
oss://testBucketName/doc-data/oss-import/small_files/*
oss://testBucketName/doc-data/oss-import/small_files/access*
oss://testBucketName/doc-data/oss-import/small_files/access_log_csv_{1,2,3}.txt
oss://testBucketName/doc-data/oss-import/*/access_log_csv_{1,2,3}.txt
oss://testBucketName/doc-data/oss-import/*/*
oss://testBucketName/doc-data/oss-import/*/access_log_csv_{1..3}.txt
oss://testBucketName/doc-data/oss-import/*/access_log_csv_?.txt