DoubleCloud 即将关闭。利用限时免费迁移服务迁移到 ClickHouse。立即联系我们 ->->

博客 / 工程

ClickHouse 数据格式简介

author avatar
Denys Golotiuk
2023 年 1 月 24 日

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 格式系列的功能,包括 跳过行、控制 空值自动解压缩等等。

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"

处理自定义文本格式的另一种方法是使用 模板格式。模板格式在导出数据方面更加强大,因为它允许将查询结果呈现为高级格式,例如 HTML

原生和二进制格式

ClickHouse 有自己的 原生格式,可用于导入和导出数据。在处理速度和空间使用方面,它比文本格式更有效。原生格式在 ClickHouse 服务器之间传输数据时很有用,此时它们彼此之间没有直接连接。例如,将数据从 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 值转储的 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 数据格式,它不会打印任何内容,而是等待查询执行。

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 │ │ └────────────────────────────────┴──────┴─────────────────────────┘

最后,我们可以使用 PrettySpace 格式(以及 PrettySpaceMonoBlock)让 ClickHouse 移除表格网格。

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,这是一个功能强大的便携式工具,用于查询、转换和转换来自本地文件的数据。

分享此帖子

订阅我们的时事通讯

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