描述
Protobuf 格式即 Protocol Buffers 格式。
此格式需要外部 format schema,并且会在查询之间缓存。
ClickHouse 支持:
proto2和proto3语法。Repeated/optional/required字段。
_ (下划线) 和 . (点) 被视为等同。
如果某一列与 Protocol Buffers’ 消息中对应字段的类型不同,则会进行必要的转换。
支持嵌套消息。例如,对于以下消息类型中的字段 z:
x.y.z 的列 (也可能是 x_y_z、X.y_Z 等) 。
嵌套消息适合作为嵌套数据结构的输入或输出。
对于在传输格式中缺失的映射字段:
- 普通的非 Nullable映射列在解析时使用 protobuf schema 中的字段默认值 (
proto2中的[default = …],否则使用类型默认值),而不是表的DEFAULT表达式。 - 映射的
Nullable(...)列在字段缺失时会解析为NULL(不采用 protobuf 字段/类型默认值) 。 - 为
google.protobuf.*Valuewrapper 启用input_format_protobuf_flatten_google_wrappers时:Nullable(...)列中缺失的 wrapper 会被视为缺失的外层字段,并变为NULL;- 存在但为空的 wrapper (
str {}) 会保留嵌套标量的默认值 (''/0); - 映射到缺失 wrapper 的非 Nullable 列会使用嵌套标量默认值,而不是
NULL。
input_format_defaults_for_omitted_fields (默认启用) 时,表的 DEFAULT (以及默认表达式) 会应用于消息类型中没有匹配字段的表列。如果该设置为 0,未映射列会保留解析时插入的数据类型默认值,而不是表的 DEFAULT 表达式。
proto2 schema 字段默认值示例 (用于消息中缺失的映射字段) :
input_format_protobuf_oneof_presence,ClickHouse 会填充一个列,用于指示检测到的是 oneof 中的哪个字段。
input_format_protobuf_oneof_presence 默认处于禁用状态。
ClickHouse 以 带长度分隔的 格式输入和输出 protobuf 消息。
这意味着每条消息前都应先写入其长度,编码为可变长度整数 (varint) 。
使用示例
读写数据
示例文件本示例中使用的文件可在 示例仓库 中找到
protobuf_message.bin 文件中的一些数据读入 ClickHouse 表中,然后再使用 Protobuf 格式将其写回名为 protobuf_message_from_clickhouse.bin 的文件。
给定文件 schemafile.proto:
生成二进制文件
生成二进制文件
如果你已经知道如何使用 现在,在与 现在从命令行运行该脚本。建议你在
Python 虚拟环境中运行它,例如使用 你需要安装以下 Python 库:运行脚本以生成二进制文件:
Protobuf 格式序列化和反序列化数据,则可以跳过此步骤。我们将使用 Python 将一些数据序列化到 protobuf_message.bin 中,并将其读入 ClickHouse。
如果你想使用其他语言,请参见:“如何在常见语言中读取/写入带长度分隔的 Protobuf 消息”。运行以下命令,在
与 schemafile.proto 相同的目录中生成一个名为 schemafile_pb2.py 的 Python 文件。该文件包含
表示你的 UserData Protobuf 消息的 Python 类:schemafile_pb2.py 相同的
目录中创建一个名为 generate_protobuf_data.py 的新 Python 文件。将以下代码粘贴进去:uv:Protobuf 格式将数据重新写入二进制文件:
protobuf_message_from_clickhouse.bin 的数据进行反序列化。
使用 ClickHouse Cloud 读写数据
format_protobuf_schema
设置在查询中直接指定 schema。本示例将说明如何从本地
机器读取序列化数据,并将其插入 ClickHouse Cloud 中的表。
与前一个示例一样,请根据 Protobuf schema 在 ClickHouse Cloud 中创建表:
format_schema_source 用于指定设置 format_schema 的来源
可能的取值:
- ‘file’ (默认) :Cloud 中不支持
- ‘string’:
format_schema是 schema 的字面内容。 - ‘query’:
format_schema是用于获取 schema 的查询。
format_schema_source='string'
format_schema_source='query'
使用自动生成的 schema
format_protobuf_use_autogenerated_schema 设置。
例如:
structureToProtobufSchema根据表结构自动生成 Protobuf schema。随后,它会使用该 schema 以 Protobuf 格式序列化数据。
你也可以使用自动生成的 schema 读取 Protobuf 文件。在这种情况下,该文件必须使用相同的 schema 创建:
format_protobuf_use_autogenerated_schema 默认启用,并在未设置 format_schema 时生效。
你也可以在输入/输出过程中,使用设置 output_format_schema 将自动生成的 schema 保存到文件中。例如:
path/to/schema/schema.capnp 中。
清除 Protobuf 缓存
format_schema_path 加载的 Protobuf schema,请使用 SYSTEM DROP ... FORMAT CACHE 语句。