在 ClickHouse 中使用原生和二进制格式
ClickHouse 支持多种二进制格式,从而实现更好的性能和空间效率。二进制格式在字符编码方面也很安全,因为数据以二进制形式保存。
我们将使用 some_data 表 和 数据 进行演示,您可以随意在您的 ClickHouse 实例上重现。
以原生 ClickHouse 格式导出
在 ClickHouse 节点之间导出和导入数据的最有效数据格式是 Native 格式。导出使用 INTO OUTFILE
子句完成
SELECT * FROM some_data
INTO OUTFILE 'data.clickhouse' FORMAT Native
这将创建一个原生格式的 data.clickhouse 文件。
从原生格式导入
要导入数据,我们可以为较小的文件或探索目的使用 file()
DESCRIBE file('data.clickhouse', Native);
┌─name──┬─type───┬─default_type─┬─default_expression─┬─comment─┬─codec_expression─┬─ttl_expression─┐
│ path │ String │ │ │ │ │ │
│ month │ Date │ │ │ │ │ │
│ hits │ UInt32 │ │ │ │ │ │
└───────┴────────┴──────────────┴────────────────────┴─────────┴──────────────────┴────────────────┘
当使用 file()
函数时,对于 ClickHouse Cloud,您需要在文件所在的机器上的 clickhouse client
中运行命令。 另一种选择是使用 clickhouse-local
在本地浏览文件。
在生产环境中,我们使用 FROM INFILE
导入数据
INSERT INTO sometable
FROM INFILE 'data.clickhouse'
FORMAT Native
原生格式压缩
我们还可以在导出到原生格式(以及大多数其他格式)的数据时启用压缩,使用 COMPRESSION
子句
SELECT * FROM some_data
INTO OUTFILE 'data.clickhouse'
COMPRESSION 'lz4'
FORMAT Native
我们为导出使用了 LZ4 压缩。我们在导入数据时必须指定它
INSERT INTO sometable
FROM INFILE 'data.clickhouse'
COMPRESSION 'lz4'
FORMAT Native
导出到 RowBinary
支持的另一种二进制格式是 RowBinary,它允许以二进制表示的行导入和导出数据
SELECT * FROM some_data
INTO OUTFILE 'data.binary' FORMAT RowBinary
这将生成一个二进制行格式的 data.binary 文件。
浏览 RowBinary 文件
此格式不支持自动 schema 推断,因此为了在加载前浏览,我们必须显式定义 schema
SELECT *
FROM file('data.binary', RowBinary, 'path String, month Date, hits UInt32')
LIMIT 5
┌─path───────────────────────────┬──────month─┬─hits─┐
│ Bangor_City_Forest │ 2015-07-01 │ 34 │
│ Alireza_Afzal │ 2017-02-01 │ 24 │
│ Akhaura-Laksam-Chittagong_Line │ 2015-09-01 │ 30 │
│ 1973_National_500 │ 2017-10-01 │ 80 │
│ Attachment │ 2017-09-01 │ 1356 │
└────────────────────────────────┴────────────┴──────┘
考虑使用 RowBinaryWithNames,它还添加了带有列名列表的标题行。 RowBinaryWithNamesAndTypes 还将添加一个带有列类型的附加标题行。
从 RowBinary 文件导入
要从 RowBinary 文件加载数据,我们可以使用 FROM INFILE
子句
INSERT INTO sometable
FROM INFILE 'data.binary'
FORMAT RowBinary
使用 RawBLOB 导入单个二进制值
假设我们想要读取整个二进制文件并将其保存到表中的字段中。 这是可以使用 RawBLOB 格式 的情况。 此格式只能直接用于单列表
CREATE TABLE images(data String) Engine = Memory
让我们将图像文件保存到 images
表中
cat image.jpg | clickhouse-client -q "INSERT INTO images FORMAT RawBLOB"
我们可以检查 data
字段长度,它将等于原始文件大小
SELECT length(data) FROM images
┌─length(data)─┐
│ 6121 │
└──────────────┘
导出 RawBLOB 数据
此格式也可用于使用 INTO OUTFILE
子句导出数据
SELECT * FROM images LIMIT 1
INTO OUTFILE 'out.jpg'
FORMAT RawBLOB
请注意,我们必须使用 LIMIT 1
,因为导出多个值会创建损坏的文件。
MessagePack
ClickHouse 支持使用 MsgPack 导入和导出到 MessagePack。 要导出为 MessagePack 格式
SELECT *
FROM some_data
INTO OUTFILE 'data.msgpk'
FORMAT MsgPack
要从 MessagePack 文件 导入数据
INSERT INTO sometable
FROM INFILE 'data.msgpk'
FORMAT MsgPack
Protocol Buffers
要使用 Protocol Buffers,我们首先需要定义一个 schema 文件
syntax = "proto3";
message MessageType {
string path = 1;
date month = 2;
uint32 hits = 3;
};
此 schema 文件的路径(在我们的例子中为 schema.proto
)在 Protobuf 格式的 format_schema
设置选项中设置
SELECT * FROM some_data
INTO OUTFILE 'proto.bin'
FORMAT Protobuf
SETTINGS format_schema = 'schema:MessageType'
这会将数据保存到 proto.bin 文件。 ClickHouse 还支持导入 Protobuf 数据以及嵌套消息。 考虑使用 ProtobufSingle 来处理单个 Protocol Buffer 消息(在这种情况下将省略长度分隔符)。
Cap’n Proto
ClickHouse 支持的另一种流行的二进制序列化格式是 Cap’n Proto。 与 Protobuf
格式类似,我们必须在我们的示例中定义一个 schema 文件 (schema.capnp
)
@0xec8ff1a10aa10dbe;
struct PathStats {
path @0 :Text;
month @1 :UInt32;
hits @2 :UInt32;
}
现在我们可以使用 CapnProto 格式和此 schema 导入和导出
SELECT
path,
CAST(month, 'UInt32') AS month,
hits
FROM some_data
INTO OUTFILE 'capnp.bin'
FORMAT CapnProto
SETTINGS format_schema = 'schema:PathStats'
请注意,我们必须将 Date
列转换为 UInt32
才能 匹配相应的类型。
其他格式
ClickHouse 引入了对多种格式(包括文本和二进制)的支持,以涵盖各种场景和平台。 在以下文章中探索更多格式以及使用它们的方式
- CSV 和 TSV 格式
- Parquet
- JSON 格式
- 正则表达式和模板
- 原生和二进制格式
- SQL 格式
另请查看 clickhouse-local - 一个便携式全功能工具,用于处理本地/远程文件,而无需启动 ClickHouse 服务器。