当您需要将本地文件导入到云数据库ClickHouse时,可通过clickhouse-client工具进行数据导入。本文为您介绍如何使用clickhouse-client工具导入数据至云数据库ClickHouse。
前提条件
已安装大于等于集群版本的clickhouse-client工具。如何安装,请参见安装clickhouse-client。
说明外网导入数据速度较慢,如果数据量较大或者测试导入性能,建议您使用内网导入。
使用内网导入数据的前提条件是,将clickhouse-client工具安装在与云数据库ClickHouse集群在同一个VPC网络的ECS实例上,连接集群时,使用VPC地址连接。
ECS实例安装clickhouse-client工具时,需访问公网。
未购买ECS实例:建议购买实例时,勾选公网 IP参数。如何购买ECS,请参见自定义购买实例。
已购买ECS实例,但未开启公网:为其绑定EIP,具体操作,请参见将EIP绑定至ECS实例。
已将安装clickhouse-client服务器的IP地址添加到云数据库ClickHouse的白名单中。如何添加白名单,请参见设置白名单。
目标文件属于可导入的文件格式。有关支持导入的常见文件格式及其文本要求,请参见支持导入的文件格式。
操作步骤
本示例为将CSV类型的文件导入到云数据库ClickHouse数据库default库中的test_tbl_distributed分布式表中。在实际使用中,请根据您的实际情况修改对应参数。示例环境如下:
目标库:default
目标表:test_tbl_distributed
源数据:testData.csv文件
步骤一:准备导入数据
在clickhouse-client客户端的安装目录下,创建名为testData.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
步骤二:建表
连接数据库。
云数据库ClickHouse集成了可视化工具DMS,能够便捷的连接集群,如何使用DMS连接集群,请参见通过DMS连接ClickHouse。
如果您使用的是其他客户端,请参见连接数据库。
根据集群版本建表。
重要需注意表字段、字段类型与文本列及其类型之间的对应关系。表字段的列顺序与类型应与实际文本数据的顺序、类型逐一对应。否则,可能会导致导入数据时出现错误。
企业版集群仅需创建本地表,社区兼容版集群则可能需要根据您的环境和需求创建分布式表。以下为示例语句,更多建表语法,请参见CREATE TABLE。
企业版
CREATE TABLE test_tbl_local ON cluster default ( id UInt8, user_name String, age UInt16, city String, access_url String ) ENGINE = MergeTree() ORDER BY id;
如果您执行此语句时报
ON CLUSTER is not allowed for Replicated database
的错误提示,可尝试通过升级版本解决此问题,如何升级版本,请参见升级内核小版本。社区兼容版
单副本和双副本的引擎有所不同,请根据您的副本类型选择相应的引擎。
重要在双副本集群中建表时,必须使用MergeTree系列引擎中支持数据复制的Replicated系列引擎。如果您在双副本集群中,创建了非Replicated系列引擎的表,将导致副本之间无法进行数据复制,从而导致副本数据可能不一致。
单副本
创建本地表。
CREATE TABLE test_tbl_local ON cluster default ( id UInt8, user_name String, age UInt16, city String, access_url String ) ENGINE = MergeTree() ORDER BY id;
(可选)创建分布式表。
如果您只需将文件导入至本地表中,可跳过此步骤。
如果您的集群为多节点集群,建议您创建分布式表。
CREATE TABLE test_tbl_distributed ON cluster default ( id UInt8, user_name String, age UInt16, city String, access_url String ) ENGINE = Distributed(default, default, test_tbl_local, rand());
双副本
创建本地表。
CREATE TABLE 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;
(可选)创建分布式表。
如果您只需将文件导入至本地表中,可跳过此步骤。
如果您的集群为多节点集群,建议您创建分布式表。
CREATE TABLE test_tbl_distributed ON cluster default ( id UInt8, user_name String, age UInt16, city String, access_url String ) ENGINE = Distributed(default, default, test_tbl_local, rand());
步骤三:导入数据
在clickhouse-client客户端的安装目录下执行如下命令。
如果您想加快导入速度,可以将原始文件等分为多份,启动多个客户端进程,并发导入。
如果您的集群是多节点集群,建议将数据导入至分布式表中。
cat <file_name> | ./clickhouse-client --host=<host> --port=<port> --user=<user> --password=<password> --query="INSERT INTO <table_name> FORMAT <file_type>";
参数 | 说明 |
file_name | 目标文件路径。 |
host | 外网地址或VPC地址。您可以在集群信息页面,查看集群外网地址或VPC地址。 建议您根据clickhouse-client所在的服务器,选择合理的连接网络:
如何为集群申请外网,请参见申请和释放外网地址。 |
port | TCP端口号。您可以在集群信息页面,查看TCP端口号。 |
user | 数据库账号。 |
password | 数据库账号的密码。 |
table_name | 目标表名。如果您创建了分布式表,此处为分布式表名。 |
file_type | 源数据文件类型。 |
步骤三:查看导入结果
连接集群。
通过DMS连接集群,请参见通过DMS连接ClickHouse。
执行查询语句。
重要如果您是社区版集群,并且是多节点集群,建议您查询分布式表;若未查询分布式表,则只能获取集群中一个节点的数据,这可能会导致查询结果少于您导入的数据。
SELECT * FROM test_tbl_local;
查询结果如下。
+--------------+---------------------+---------------+----------------+----------------------+ | 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 | +--------------+---------------------+---------------+----------------+----------------------+
支持导入的文件格式
支持导入的常见文件格式如下。
文本中,每行数据对应表中一条数据,每列数据对应创建表时的一个字段。
下述文件中,即使有的文件第一列或第二列有对列名或列类型描述,但这些内容都不会被解析,被解析的只有真正需要入表的数据。因此,此处列名和数据类型,并不能决定数据将来入表列的位置以及数据类型。
文件格式 | 文本要求 | 示例 |
TabSeparated |
|
|
TabSeparatedWithNames | 与TabSeparated类似,区别在于此文本要求第一行是列名。解析文本时,第一行会被忽略。 |
|
TabSeparatedWithNamesAndTypes | 与TabSeparated类似,区别是第一行是列名,第二行是类型。解析文本时,第一行、第二行都会被忽略。 |
|
CSV |
|
|
CSVWithNames | 与CSV类似,区别在于第一行表示列名。解析文本时,第一行会被忽略。 |
|
更多文件格式,请参见文件格式及说明。
相关文档
更多迁移方案,请参见数据迁移同步。