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

Protobuf

ClickHouse Cloud 中不支持
输入输出别名

描述

Protobuf 格式是 Protocol Buffers 格式。

此格式需要外部格式 schema,该 schema 在查询之间缓存。

ClickHouse 支持

  • proto2proto3 语法。
  • Repeated/optional/required 字段。

用法示例

基本示例

使用示例

SELECT * FROM test.table FORMAT Protobuf SETTINGS format_schema = 'schemafile:MessageType'
cat protobuf_messages.bin | clickhouse-client --query "INSERT INTO test.table SETTINGS format_schema='schemafile:MessageType' FORMAT Protobuf"

其中文件 schemafile.proto 看起来像这样

syntax = "proto3";

message MessageType {
string name = 1;
string surname = 2;
uint32 birthDate = 3;
repeated string phoneNumbers = 4;
};

为了找到表列和 Protocol Buffers 消息类型的字段之间的对应关系,ClickHouse 会比较它们的名称。此比较不区分大小写,字符 _(下划线)和 .(点)被视为相等。如果 Protocol Buffers 消息的列和字段的类型不同,则会应用必要的转换。

支持嵌套消息。例如,对于以下消息类型中的字段 z

message MessageType {
message XType {
message YType {
int32 z;
};
repeated YType y;
};
XType x;
};

ClickHouse 尝试查找名为 x.y.z(或 x_y_zX.y_Z 等)的列。

嵌套消息适用于 嵌套数据结构 的输入或输出。

在 protobuf schema 中定义的默认值(如下所示)不适用,而是使用 表默认值 代替它们

syntax = "proto2";

message MessageType {
optional int32 result_per_page = 3 [default = 10];
}

ClickHouse 以 length-delimited 格式输入和输出 protobuf 消息。这意味着在每条消息之前,其长度应以 可变宽度整数 (varint) 形式写入。

另请参阅:如何在常用语言中读取/写入 length-delimited protobuf 消息

使用自动生成的 Schema

如果您没有数据的外部 Protobuf schema,您仍然可以使用自动生成的 schema 以 Protobuf 格式输出/输入数据。

例如

SELECT * FROM test.hits format Protobuf SETTINGS format_protobuf_use_autogenerated_schema=1

在这种情况下,ClickHouse 将使用函数 structureToProtobufSchema 根据表结构自动生成 Protobuf schema。然后,它将使用此 schema 以 Protobuf 格式序列化数据。

您还可以使用自动生成的 schema 读取 Protobuf 文件。在这种情况下,文件必须使用相同的 schema 创建

$ cat hits.bin | clickhouse-client --query "INSERT INTO test.hits SETTINGS format_protobuf_use_autogenerated_schema=1 FORMAT Protobuf"

设置 format_protobuf_use_autogenerated_schema 默认启用,并且在未设置 format_schema 时应用。

您还可以在输入/输出期间使用设置 output_format_schema 将自动生成的 schema 保存在文件中。例如

SELECT * FROM test.hits format Protobuf SETTINGS format_protobuf_use_autogenerated_schema=1, output_format_schema='path/to/schema/schema.proto'

在这种情况下,自动生成的 Protobuf schema 将保存在文件 path/to/schema/schema.capnp 中。

删除 Protobuf 缓存

要重新加载从 format_schema_path 加载的 Protobuf schema,请使用 SYSTEM DROP ... FORMAT CACHE 语句。

SYSTEM DROP FORMAT SCHEMA CACHE FOR Protobuf

格式设置