跳到主要内容
跳到主要内容

在 ClickHouse 中使用原生和二进制格式

ClickHouse 支持多种二进制格式,这些格式可以提供更好的性能和空间效率。二进制格式在字符编码方面也是安全的,因为数据以二进制形式保存。

我们将使用一些数据 数据 进行演示,您可以在您的 ClickHouse 实例上进行复现。

导出为原生 ClickHouse 格式

在 ClickHouse 节点之间导入和导出数据最有效的数据格式是 Native 格式。导出是通过 INTO OUTFILE 子句进行的:

这将创建 data.clickhouse 文件,采用原生格式。

从原生格式导入

要导入数据,可以使用 file() 用于较小文件或探索目的:

提示

使用 file() 函数时,如果使用 ClickHouse Cloud,您需要在文件所在机器上的 clickhouse client 中运行命令。另一种选择是使用 clickhouse-local 在本地探索文件。

在生产环境中,我们使用 FROM INFILE 导入数据:

原生格式压缩

我们还可以在导出数据到原生格式时启用压缩(以及大多数其他格式),使用 COMPRESSION 子句:

我们使用 LZ4 压缩进行导出。在导入数据时,我们需要指定它:

导出为 RowBinary

另一个支持的二进制格式是 RowBinary,它允许以二进制表示的行导入和导出数据:

这将生成 data.binary 文件,采用二进制行格式。

探索 RowBinary 文件

此格式不支持自动模式推断,因此在加载之前,我们必须明确定义模式:

考虑使用 RowBinaryWithNames,它还添加了带有列列表的标题行。RowBinaryWithNamesAndTypes 还会添加一行带有列类型的额外标题。

从 RowBinary 文件导入

要从 RowBinary 文件加载数据,我们可以使用 FROM INFILE 子句:

使用 RawBLOB 导入单个二进制值

假设我们想要读取整个二进制文件并将其保存到表中的一个字段。这是可以使用 RawBLOB 格式 的情况。该格式只能与单列表直接使用:

让我们将图像文件保存到 images 表中:

我们可以检查 data 字段长度,等于原始文件大小:

导出 RawBLOB 数据

该格式也可以用于使用 INTO OUTFILE 子句导出数据:

请注意,我们必须使用 LIMIT 1 因为导出超过一个值将创建一个损坏的文件。

MessagePack

ClickHouse 支持使用 MsgPack 导入和导出到 MessagePack。要导出为 MessagePack 格式:

要从 MessagePack 文件 导入数据:

Protocol Buffers

Not supported in ClickHouse Cloud

要使用 Protocol Buffers,我们首先需要定义一个 模式文件

该模式文件的路径(在我们的例子中为 schema.proto)在 Protobuf 格式的 format_schema 设置选项中设置:

这将数据保存到 proto.bin 文件。ClickHouse 还支持导入 Protobuf 数据以及嵌套消息。考虑使用 ProtobufSingle 来处理单个 Protocol Buffer 消息(此情况下将省略长度分隔符)。

Cap'n Proto

Not supported in ClickHouse Cloud

另一个 ClickHouse 支持的流行二进制序列化格式是 Cap'n Proto。与 Protobuf 格式类似,我们必须在我们的例子中定义一个模式文件(schema.capnp):

现在我们可以使用 CapnProto 格式及该模式进行导入和导出:

请注意,我们必须将 Date 列强制转换为 UInt32匹配相应类型

其他格式

ClickHouse 引入对许多格式的支持,包括文本和二进制,以覆盖各种场景和平台。在以下文章中探索更多格式及其工作方式:

同时也查看 clickhouse-local - 一个便携的全功能工具,可以在不启动 ClickHouse 服务器的情况下处理本地/远程文件。