博客 / 工程

ClickHouse 数据格式简介

author avatar
Denys Golotiuk
2023 年 1 月 24 日 - 9 分钟阅读

data-formats.png

简介

ClickHouse 的新用户常常对其支持的数据格式之多感到惊讶,但有时需要帮助来确定加载数据的最佳和最简单方法。由于我们认为将数据加载到您最喜欢的 OSS 数据库应该尽可能容易,因此我们最近增强了我们的文档,以包含最流行格式的示例。这也包括一些对更有经验的用户有用的提示和技巧。

本文简要概述了 ClickHouse 对不同格式的广泛支持以及如何加载本地文件。

导入和导出数据

ClickHouse 支持大多数已知的文本和二进制数据格式。这使得可以轻松集成到几乎任何工作数据管道中,以利用 ClickHouse 的优势。

标准文本格式

CSV 是最流行的数据存储格式之一,因为它很简单。使用CSV格式可以轻松导入和导出 CSV 数据

clickhouse-client -q "INSERT INTO some_table FORMAT CSV" < data.csv

在许多情况下,CSV 文件已损坏、编码不良,并且具有自定义分隔符甚至行分隔符。ClickHouse 提供了处理所有这些情况的方法。

要处理具有自定义分隔符(在我们的示例中为;)的 CSV,我们必须设置以下选项

SET format_csv_delimiter = ';';

从损坏或自定义 CSV 文件导入数据

如果 CSV 文件以非标准方式编码或无效,我们可以使用CustomSeparated格式来自定义转义规则和分隔符

SET format_custom_field_delimiter = '|';
SET format_custom_row_between_delimiter = ';';
SET format_custom_escaping_rule = 'JSON';

在这里,我们使用了 JSON 转义规则|作为自定义值分隔符,以及;作为行分隔符。更改设置后,我们可以继续导入

INSERT INTO some_table FROM INFILE 'custom.csv' FORMAT CustomSeparated

另一种流行的文本数据格式是制表符分隔值 (TSV),ClickHouse 也使用TabSeparated格式支持它

clickhouse-client -q "INSERT INTO some_table FORMAT TabSeparated" < 
data.tsv

在我们的文档中探索更多 ClickHouse 在处理 CSV 格式系列方面的功能,包括跳过行、控制Null 值自动解压缩等等。

JSON 数据

ClickHouse 可以处理几乎任何 JSON 数据,无论是值数组、对象对象还是单独的 JSON 对象。

例如,日志记录应用程序可以将日志编写为每行一个 JSON 对象(称为NDJson)。这种情况可以使用 ClickHouse 中的JSONEachRow格式来解决

clickhouse-client - q "INSERT INTO sometable FORMAT JSONEachRow" < 
access.log

探索如何将不同形式的 JSON 数据加载到 ClickHouse以及如何导出。值得一提的是,ClickHouse 还支持 MongoDB 使用的BSON 格式

用于自定义文本格式的正则表达式

除了 CSV 或 JSON 等标准格式外,ClickHouse 还支持基于正则表达式的数据导入。在这种情况下,应将Regexp格式与包含带捕获组(视为表列)的正则表达式的format_regexp选项一起使用

INSERT INTO some_log FROM INFILE 'custom.txt'
SETTINGS
  format_regexp = '([0-9]+?) \[(.+?)\] \- "(.+)"'
FORMAT Regexp

此查询可用于加载以下示例文件

121201 [notice] - "Started service"
121202 [error] - "Configuration file not found"
122203 [warning] - "Creating default configuration file"

处理自定义文本格式的另一种选择是使用Template 格式。Template 格式在导出数据方面甚至更强大,因为它允许将查询结果渲染为高级格式,例如HTML

原生和二进制格式

ClickHouse 有自己的原生格式,可用于导入和导出数据。在处理速度和空间使用方面,它比文本格式更有效。当 ClickHouse 服务器之间没有直接连接时,Native 格式有助于在它们之间传输数据。例如,将数据从 ClickHouse 服务器传输到 ClickHouse Cloud

clickhouse-client -q "SELECT * FROM some_table FORMAT Native" | \
clickhouse-client --host some.aws.clickhouse.cloud --secure \
--port 9440 --password 12345 \
-q "INSERT INTO some_table FORMAT Native"

二进制格式通常比文本格式更有效且更安全,但支持有限。ClickHouse 具有用于通用二进制情况的 RowBinary 格式,而 RawBLOB 与(但不限于)文件一起使用。此外,ClickHouse 还支持流行的序列化格式,如 Protocol BuffersCap’n ProtoMessage Pack

Parquet 和其他 Apache 格式

Apache 有多种数据存储和序列化格式,在 Hadoop 环境中很流行。ClickHouse 可以处理所有这些格式,包括 Parquet

我们可以从 Parquet 文件导入数据

clickhouse-client -q "INSERT INTO some_table FORMAT Parquet" < 
data.parquet

通过使用file()函数和clickhouse-local,我们可以在实际加载数据到表之前探索数据

SELECT * FROM file('data.parquet') LIMIT 3; ┌─path──────────────────────┬─date───────┬─hits─┐ │ Akiba_Hebrew_Academy │ 2017-08-01 │ 241 │ │ Aegithina_tiphia │ 2018-02-01 │ 34 │ │ 1971-72_Utah_Stars_season │ 2016-10-01 │ 1 │ └───────────────────────────┴────────────┴──────┘

我们还可以使用客户端将数据导出到 Parquet 文件

clickhouse-client -q "SELECT * FROM some_table FORMAT Parquet" > 
file.parquet

了解更多关于其他受支持的 Apache 格式,例如 AvroArrowORC

SQL 转储

虽然 SQL 转储在存储和传输数据方面效率不高,但 ClickHouse 支持从 MySQL 转储加载数据,并为 Mysql、PostgreSQL 和其他数据库创建 SQL 转储。

要创建 SQL 转储,应使用SQLInsert格式

SET output_format_sql_insert_table_name = 'a_table_name';
SET output_format_sql_insert_include_column_names = 0;
SELECT * FROM some_table
INTO OUTFILE 'dump.sql'
FORMAT SQLInsert;

这将创建dump.sql文件,其中包含 SQL 值转储。它将使用a_table_name作为表名并跳过列声明。然后可以将其馈送到其他 DBMS

psql < dump.sql

ClickHouse 还支持使用MySQLDump格式从 MySQL 转储导入数据

cat mysql-dump.sql | clickhouse-client -q "INSERT INTO some_data FORMAT MySQLDump"

在 ClickHouse 中了解更多关于导入和导出 SQL 数据的信息。

用于性能测试的 Null 格式

还有一种特殊的Null数据格式,它不会打印任何内容,但会等待查询执行

SELECT *
FROM big_table
LIMIT 100000
FORMAT `Null`

0 rows in set. Elapsed: 1.112 sec. Processed 131.07 thousand rows, 167.57 MB (117.86 thousand rows/s., 150.68 MB/s.)

ClickHouse 服务器仍然将数据返回给客户端,但不会打印出来。这使得Null格式对于测试返回过多数据而无法放入终端的查询性能非常有用。

美化命令行

默认情况下,ClickHouse 对命令行客户端使用PrettyCompact格式。它有时以块的形式输出数据(一旦返回结果)

┌─id──────────────────────────┬─gender─┬─birth_year─┐ │ B7mkoLYIZEdoPkfCRTKtYg_0000 │ female │ 1951 │ └─────────────────────────────┴────────┴────────────┘ ┌─id──────────────────────────┬─gender─┬─birth_year─┐ │ nzHXUMnmjspwV4JxL-KqzQ_0000 │ female │ 1956 │ └─────────────────────────────┴────────┴────────────┘ ┌─id──────────────────────────┬─gender─┬─birth_year─┐ │ 5cs05UbDttZBFBE6tPpjUg_0000 │ male │ 1989 │ │ 5cs05UbDttZBFBE6tPpjUg_0000 │ male │ 1989 │ └─────────────────────────────┴────────┴────────────┘ ...

我们可以使用PrettyCompactMonoBlock来要求 ClickHouse 将结果输出为单个表

SELECT * FROM some_table FORMAT PrettyCompactMonoBlock; ┌─id──────────────────────────┬─gender─┬─birth_year─┐ │ B7mkoLYIZEdoPkfCRTKtYg_0000 │ female │ 1951 │ │ nzHXUMnmjspwV4JxL-KqzQ_0000 │ female │ 1956 │ │ 5cs05UbDttZBFBE6tPpjUg_0000 │ male │ 1989 │ │ 5cs05UbDttZBFBE6tPpjUg_0000 │ male │ 1989 │ │ mcXoSkxAk-1xGpSiqnCB1Q_0000 │ female │ 1961 │ └─────────────────────────────┴────────┴────────────┘

不太紧凑但更容易理解的是Pretty格式(PrettyMonoBlock也适用于单表输出)

SELECT FROM some_table FORMAT PrettyMonoBlock; ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━┓ ┃ path ┃ hits ┃ bar(hits, 0, 1500, 25) ┃ ┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━┩ │ Bangor_City_Forest │ 34 │ ▌ │ ├────────────────────────────────┼──────┼─────────────────────────┤ │ Alireza_Afzal │ 24 │ ▍ │ ├────────────────────────────────┼──────┼─────────────────────────┤ │ Akhaura-Laksam-Chittagong_Line │ 30 │ ▌ │ ├────────────────────────────────┼──────┼─────────────────────────┤ │ 1973_National_500 │ 80 │ █▎ │ ├────────────────────────────────┼──────┼─────────────────────────┤ │ Attachment │ 1356 │ ██████████████████████▌ │ ├────────────────────────────────┼──────┼─────────────────────────┤ │ Kellett_Strait │ 5 │ │ ├────────────────────────────────┼──────┼─────────────────────────┤ │ Ajarani_River │ 30 │ ▌ │ ├────────────────────────────────┼──────┼─────────────────────────┤ │ Akbarabad,_Khomeyn │ 8 │ ▏ │ ├────────────────────────────────┼──────┼─────────────────────────┤ │ Adriaan_Theodoor_Peperzak │ 88 │ █▍ │ ├────────────────────────────────┼──────┼─────────────────────────┤ │ Alucita_dryogramma │ 1 │ │ └────────────────────────────────┴──────┴─────────────────────────┘

最后,我们可以要求 ClickHouse 使用PrettySpace格式(和PrettySpaceMonoBlock)摆脱表格网格

SELECT FROM some_table FORMAT PrettySpace; path hits bar(hits, 0, 1500, 25) Bangor_City_Forest 34 ▌ Alireza_Afzal 24 ▍ Akhaura-Laksam-Chittagong_Line 30 ▌ 1973_National_500 80 █▎ Attachment 1356 ██████████████████████▌ Kellett_Strait 5 Ajarani_River 30 ▌ Akbarabad,_Khomeyn 8 ▏ Adriaan_Theodoor_Peperzak 88 █▍ Alucita_dryogramma 1

总结

ClickHouse 为所有可以想象的格式(标准文本、二进制或自定义格式)提供了工具。在官方文档和我们的新指南中深入探索数据格式,我们计划继续增强这些指南。考虑使用clickhouse-local,这是一个强大的便携式工具,用于查询、转换和转换本地文件中的数据。

分享此帖子

订阅我们的新闻通讯

随时了解功能发布、产品路线图、支持和云产品!
正在加载表单...
关注我们
X imageSlack imageGitHub image
Telegram imageMeetup imageRss image
©2025ClickHouse, Inc. 总部位于加利福尼亚州湾区和荷兰阿姆斯特丹。