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

CapnProto

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

描述

CapnProto 格式是一种二进制消息格式,类似于 Protocol Buffers 格式和 Thrift,但不像 JSONMessagePack。 CapnProto 消息是严格类型的,并且不是自描述的,这意味着它们需要外部 schema 描述。 schema 是动态应用的,并为每个查询缓存。

另请参阅 格式 Schema

数据类型匹配

下表显示了支持的数据类型以及它们在 INSERTSELECT 查询中如何匹配 ClickHouse 数据类型

CapnProto 数据类型 (INSERT)ClickHouse 数据类型CapnProto 数据类型 (SELECT)
UINT8, BOOLUInt8UINT8
INT8Int8INT8
UINT16UInt16, DateUINT16
INT16Int16INT16
UINT32UInt32, DateTimeUINT32
INT32Int32, Decimal32INT32
UINT64UInt64UINT64
INT64Int64, DateTime64, Decimal64INT64
FLOAT32Float32FLOAT32
FLOAT64Float64FLOAT64
TEXT, DATAString, FixedStringTEXT, DATA
union(T, Void), union(Void, T)Nullable(T)union(T, Void), union(Void, T)
ENUMEnum(8/16)ENUM
LISTArrayLIST
STRUCTTupleSTRUCT
UINT32IPv4UINT32
DATAIPv6DATA
DATAInt128/UInt128/Int256/UInt256DATA
DATADecimal128/Decimal256DATA
STRUCT(entries LIST(STRUCT(key Key, value Value)))MapSTRUCT(entries LIST(STRUCT(key Key, value Value)))
  • 整数类型可以在输入/输出期间相互转换。
  • 为了在 CapnProto 格式中使用 Enum,请使用 format_capn_proto_enum_comparising_mode 设置。
  • 数组可以是嵌套的,并且可以具有 Nullable 类型的值作为参数。 TupleMap 类型也可以嵌套。

使用示例

插入和选择数据

您可以使用以下命令将文件中的 CapnProto 数据插入到 ClickHouse 表中

$ cat capnproto_messages.bin | clickhouse-client --query "INSERT INTO test.hits SETTINGS format_schema = 'schema:Message' FORMAT CapnProto"

其中 schema.capnp 看起来像这样

struct Message {
SearchPhrase @0 :Text;
c @1 :Uint64;
}

您可以使用以下命令从 ClickHouse 表中选择数据,并将其以 CapnProto 格式保存到某个文件中

$ clickhouse-client --query = "SELECT * FROM test.hits FORMAT CapnProto SETTINGS format_schema = 'schema:Message'"

使用自动生成的 schema

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

例如

SELECT * FROM test.hits 
FORMAT CapnProto
SETTINGS format_capn_proto_use_autogenerated_schema=1

在这种情况下,ClickHouse 将根据表结构使用函数 structureToCapnProtoSchema 自动生成 CapnProto schema,并将使用此 schema 以 CapnProto 格式序列化数据。

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

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

格式设置

默认情况下启用 format_capn_proto_use_autogenerated_schema 设置,并且如果未设置 format_schema,则适用。

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

例如

SELECT * FROM test.hits 
FORMAT CapnProto
SETTINGS
format_capn_proto_use_autogenerated_schema=1,
output_format_schema='path/to/schema/schema.capnp'

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