全部產品
Search
文件中心

ApsaraDB for ClickHouse:使用clickhouse-client匯入資料

更新時間:Mar 13, 2025

當您需要將本地檔案匯入到雲資料庫ClickHouse時,可通過clickhouse-client工具進行資料匯入。本文為您介紹如何使用clickhouse-client工具匯入資料至雲資料庫ClickHouse

前提條件

  • 已建立資料庫帳號,如何建立帳號,請參見社區相容版帳號管理企業版帳號管理

  • 已安裝大於等於叢集版本的clickhouse-client工具。如何安裝,請參見安裝clickhouse-client

    說明

    外網匯入資料速度較慢,如果資料量較大或者測試匯入效能,建議您使用內網匯入。

    使用內網匯入資料的前提條件是,將clickhouse-client工具安裝在與雲資料庫ClickHouse叢集在同一個VPC網路的ECS執行個體上,串連叢集時,使用VPC地址串連。

    ECS執行個體安裝clickhouse-client工具時,需訪問公網。

  • 已將安裝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

更多檔案格式,請參見檔案格式及說明

相關文檔

更多遷移方案,請參見資料移轉同步