使用clickhouse-client导入数据

当您需要将本地文件导入到云数据库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

步骤二:建表

  1. 连接数据库。

    云数据库ClickHouse集成了可视化工具DMS,能够便捷的连接集群,如何使用DMS连接集群,请参见通过DMS连接ClickHouse

    如果您使用的是其他客户端,请参见连接数据库

  2. 根据集群版本建表。

    重要

    需注意表字段、字段类型与文本列及其类型之间的对应关系。表字段的列顺序与类型应与实际文本数据的顺序、类型逐一对应。否则,可能会导致导入数据时出现错误。

    企业版集群仅需创建本地表,社区兼容版集群则可能需要根据您的环境和需求创建分布式表。以下为示例语句,更多建表语法,请参见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系列引擎的表,将导致副本之间无法进行数据复制,从而导致副本数据可能不一致。

    单副本

    1. 创建本地表。

      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;
    2. (可选)创建分布式表。

      如果您只需将文件导入至本地表中,可跳过此步骤。

      如果您的集群为多节点集群,建议您创建分布式表。

      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());

    双副本

    1. 创建本地表。

      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;
    2. (可选)创建分布式表。

      如果您只需将文件导入至本地表中,可跳过此步骤。

      如果您的集群为多节点集群,建议您创建分布式表。

      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所在的服务器,选择合理的连接网络:

  • 阿里云ECS:

    云数据库ClickHouse集群在同一VPC下:建议您使用VPC地址进行连接,内网数据导入较快。

    云数据库ClickHouse集群在不同VPC下:建议您使用外网进行连接。

  • 非阿里云ECS:建议您使用外网进行连接。

如何为集群申请外网,请参见申请和释放外网地址

port

TCP端口号。您可以在集群信息页面,查看TCP端口号。

user

数据库账号。

password

数据库账号的密码。

table_name

目标表名。如果您创建了分布式表,此处为分布式表名。

file_type

源数据文件类型。

步骤三:查看导入结果

  1. 连接集群。

    通过DMS连接集群,请参见通过DMS连接ClickHouse

  2. 执行查询语句。

    重要

    如果您是社区版集群,并且是多节点集群,建议您查询分布式表;若未查询分布式表,则只能获取集群中一个节点的数据,这可能会导致查询结果少于您导入的数据。

    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

  • 数据按行写入文本文件中,列与列之间通过Tab分割。

  • 需要对Tab、换行符、反斜线进行转义处理,分别对应为:\t\n\\

  • NULL值使用\N进行表示。

张三\t28\t软件工程师\n
李四\t32\t数据分析师\n
王五\t25\t产品经理\n

TabSeparatedWithNames

TabSeparated类似,区别在于此文本要求第一行是列名。解析文本时,第一行会被忽略。

姓名\t年龄\t职业\n
张三\t28\t软件工程师\n
李四\t32\t数据分析师\n
王五\t25\t产品经理\n

TabSeparatedWithNamesAndTypes

TabSeparated类似,区别是第一行是列名,第二行是类型。解析文本时,第一行、第二行都会被忽略。

姓名\t年龄\t职业\n
String\tUInt16\tString\n
张三\t28\t软件工程师\n
李四\t32\t数据分析师\n
王五\t25\t产品经理\n

CSV

  • 数据按行写入文件中。

  • 字符串本身的双引号用两个双引号进行转义。例如有文本 "Hello, World!",则在文件中需写成 ""Hello, World!""

  • 数值类型不使用双引号。

  • 默认列分隔符为,,您也可以在执行导入命令时,通过--format_csv_delimiter指定其他列分隔符,例如列与列之间使用竖线分割,则命令示例如下。

    cat testData.csv | ./clickhouse-client --format_csv_delimiter="|" --host=cc-bp163l724nkf8****.clickhouse.ads.aliyuncs.com --port=3306 --user=test --password=123456Aa --query="INSERT INTO test_tbl_distributed FORMAT CSV";
张三,28,软件工程师
李四,t32,数据分析师
王五,t25,产品经理

CSVWithNames

CSV类似,区别在于第一行表示列名。解析文本时,第一行会被忽略。

id,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

更多文件格式,请参见文件格式及说明

相关文档

更多迁移方案,请参见数据迁移同步