在實務的資料分析與數倉場景中,批次匯入(Batch Import)是 ClickHouse 最常見的資料導入方式之一。
根據資料量、來源與格式的不同,選擇合適的匯入方法與檔案格式,能大幅提升匯入速度並降低資源消耗。
本篇將介紹三種常見格式:
在 ClickHouse 中,批次匯入最常透過以下方式進行:
INSERT INTO ... FORMAT
)clickhouse-local
、ETL 工具、Python SDK)無論使用哪種方式,都必須:
CREATE TABLE events_csv
(
event_date Date,
user_id UInt64,
action String
) ENGINE = MergeTree()
ORDER BY (event_date, user_id);
clickhouse-client --query="INSERT INTO events_csv FORMAT CSV" < events.csv
加上 --max_insert_block_size=1000000
增加批次寫入大小
對於大檔案,可搭配 gzip
壓縮:
zcat events.csv.gz | clickhouse-client --query="INSERT INTO events_csv FORMAT CSV"
CREATE TABLE events_parquet
(
event_date Date,
user_id UInt64,
action String
) ENGINE = MergeTree()
ORDER BY (event_date, user_id);
clickhouse-client --query="INSERT INTO events_parquet FORMAT Parquet" < events.parquet
Parquet 已壓縮,匯入時 CPU 壓力較高但 I/O 成本低
避免匯入過多小檔案(可先合併再匯入)
若檔案在雲端(S3),可直接用 s3()
函數載入:
INSERT INTO events_parquet
SELECT * FROM s3('https://bucket/file.parquet', 'AWS_KEY', 'AWS_SECRET', 'Parquet');
clickhouse-client --query="SELECT * FROM events_csv FORMAT Native" > events.native
clickhouse-client --query="INSERT INTO events_native FORMAT Native" < events.native
clickhouse-backup
工具全庫搬遷策略 | 說明 |
---|---|
大批量一次性匯入 | 避免多次小批量 INSERT,減少寫入壓力 |
排序鍵對齊 | 匯入資料順序與 ORDER BY 鍵一致,可降低 Merge 開銷 |
關閉索引檢查 | 批次匯入前可暫時停用部分檢查(如 constraints ) |
分區分批匯入 | 按日期或業務鍵切分檔案,平行匯入 |
格式 | 優點 | 缺點 | 適用場景 |
---|---|---|---|
CSV | 通用、易讀、易產生 | 體積大、解析慢 | 系統間交換、小規模匯入 |
Parquet | 壓縮率高、列式存儲 | 解析較耗 CPU | 大資料批量匯入 |
Native | 匯入最快、無解析 | 僅 ClickHouse 可用 | 備份還原、集群遷移 |
若批次匯入頻繁,可以搭配 分區策略(Partitioning) 與 分批併發匯入,進一步縮短導入時間。