简介
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 Buffers、Cap'n Proto 和 Message 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 格式的更多信息,例如 Avro、Arrow 和 ORC。
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,这是一个功能强大的便携式工具,用于查询、转换和转换来自本地文件的数据。