在 ClickHouse 中使用本地和二进制格式
ClickHouse 支持多种二进制格式,这能提高性能并节省空间。二进制格式在字符编码上也是安全的,因为数据以二进制形式保存。
我们将使用 some_data 表 和 数据 进行演示,欢迎在您的 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 format。此格式只能与单列表直接使用:
让我们将一个图像文件保存到 images
表中:
我们可以检查 data
字段的长度,该长度将等于原始文件大小:
导出 RawBLOB 数据
此格式也可以用于通过 INTO OUTFILE
子句导出数据:
注意:我们必须使用 LIMIT 1
,因为导出多个值将创建损坏的文件。
MessagePack
ClickHouse 支持使用 MsgPack 导入和导出到 MessagePack。要导出到 MessagePack 格式:
从 MessagePack 文件 导入数据:
协议缓冲区
要与 Protocol Buffers 一起使用,我们首先需要定义一个 schema file:
此模式文件(在我们案例中为 schema.proto
)的路径设置在 Protobuf 格式的 format_schema
设置选项中:
这将数据保存到 proto.bin 文件。ClickHouse 还支持导入 Protobuf 数据以及嵌套消息。考虑使用 ProtobufSingle 来处理单个协议缓冲消息(在这种情况下将省略长度分隔符)。
Cap’n Proto
ClickHouse 支持的另一种流行二进制序列化格式是 Cap’n Proto。与 Protobuf
格式类似,我们需要定义一个模式文件(在我们示例中的 schema.capnp
):
现在我们可以使用 CapnProto 格式和此模式进行导入和导出:
注意:我们必须将 Date
列强制转换为 UInt32
以 匹配对应的类型。
其他格式
ClickHouse 引入了对多种格式的支持,包括文本和二进制,以涵盖各种场景和平台。在以下文章中探索更多格式及其使用方式:
- CSV 和 TSV 格式
- Parquet
- JSON 格式
- 正则表达式和模板
- 本地和二进制格式
- SQL 格式
并且还请查看 clickhouse-local - 一款便携式全功能工具,能够在不启动 ClickHouse 服务器的情况下处理本地/远程文件。