简介
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 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 值转储。它将使用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,这是一个强大的便携式工具,用于查询、转换和转换本地文件中的数据。