ProtobufReader

文档中心 › 组件索引 › ProtobufReader

ProtobufReader Controller Service

类型全限定名:cn.org.acal.lynxus.services.protobuf.ProtobufReader

所属 Bundle:cn.org.acal.lynxus:lynxus-protobuf-services-nar:2.11.8

描述

从二进制格式解析 Protocol Buffers 消息。

标签

protobufrecordreaderparser

属性

下表中,加粗的属性为必填项;其余为可选项。表格同时标注默认值、是否支持表达式语言,以及是否为敏感属性(值会被加密)。

名称默认值可选值描述
Schema Access Strategygenerate-from-proto-file
  • 使用 'Schema Name' 属性 — 要使用的 Schema 名称由 'Schema Name' 属性指定。此属性的值用于在配置的 Schema Registry 服务中查找 Schema。
  • 使用 'Schema Text' 属性 — Schema 本身的文本由 'Schema Text' 属性指定。此属性的值必须是有效的 Avro Schema。如果使用表达式语言,则 'Schema Text' 属性的值在替换表达式后必须有效。
  • Schema 引用读取器 — Schema 引用信息将通过配置的 Schema 引用读取器服务实现提供。
  • Generate from Proto file — 记录 schema 由提供的 proto 文件生成
指定如何获取用于解释数据的架构。
Schema Registry控制器服务 API:
SchemaRegistry
cn.org.acal.lynxus-lynxus-standard-services-api-nar-2.11.8
指定用于架构Registry的Controller Service
Schema Name${schema.name}指定要在架构Registry属性中查找的架构名称
支持表达式语言:是(使用 FlowFile 属性与环境/系统变量求值)
Schema Version指定在 Schema Registry 中查找 Schema 的版本。如果未指定,则检索 Schema 的最新版本。
支持表达式语言:是(使用 FlowFile 属性与环境/系统变量求值)
Schema Branch指定在 Schema Registry 属性中查找 Schema 时使用的分支名称。如果选择的 Schema Registry 不支持分支,则此值将被忽略。
支持表达式语言:是(使用 FlowFile 属性与环境/系统变量求值)
Schema Text${avro.schema}Avro 格式的架构文本
支持表达式语言:是(使用 FlowFile 属性与环境/系统变量求值)
Schema Reference Reader控制器服务 API:
SchemaReferenceReader
cn.org.acal.lynxus-lynxus-standard-services-api-nar-2.11.8
服务实现负责读取 FlowFile 属性或内容以确定架构参考标识符
Proto Directory包含 Protocol Buffers 消息定义 (.proto) 文件的目录。
支持表达式语言:是(仅使用环境/系统变量求值)
消息类型Protocol Buffers 消息类型的完全限定名,包括其包(例如 mypackage.MyMessage)。在 'Proto Directory' 中配置的 .proto 文件必须包含此消息类型的定义。
支持表达式语言:是(仅使用环境/系统变量求值)

状态管理

该组件不存储状态。

受限 (Restricted)

该组件不受限。

提供的 Service API

  • RecordReaderFactory (cn.org.acal.lynxus-lynxus-standard-services-api-nar-2.11.8)

另请参阅

详细说明

ProtobufReader

ProtobufReader Controller Service 从二进制格式读取并解析 Protocol Buffers Message,并创建 Record 对象。该 Controller Service 必须配置与消息编码时使用的相同 '.proto' 文件,以及包含包名的消息类型全限定名(例如 mypackage.MyMessage)。该 Reader 始终从输入数据生成一条记录,表示所提供的 Protocol Buffers Message 类型。关于 Protocol Buffers 的更多信息参见:protobuf.dev

数据类型映射

从传入数据解析记录时,该 Controller Service 会把 Proto Message 字段类型映射到对应的 Lynxus 数据类型。所提供的 Message 字段与编码输入之间的映射始终基于字段标签号。当字段定义为 'repeated' 时,其数据类型是原指定类型的数组。下表展示了转换后 proto 字段类型与 Lynxus 字段类型的对应关系。

标量值类型

Proto 类型 Proto Wire 类型 Lynxus 数据类型
double fixed64 double
float fixed32 float
int32 varint int
int64 varint long
uint32 varint long
uint64 varint bigint
sint32 varint long
sint64 varint long
fixed32 fixed32 long
fixed64 fixed64 bigint
sfixed32 varint int
sfixed64 varint long
bool varint boolean
string length delimited string
bytes length delimited array[byte]

复合值类型

Proto 类型 Proto Wire 类型 Lynxus 数据类型
message length delimited record
enum varint enum
map length delimited map
oneof - choice

Schema 与类型强制转换

从传入数据解析记录时,记录会被拆分为字段。每个字段会按字段名 在配置的 schema 中查找,以确定数据的类型。如果字段不在 schema 中,该字段会以其原始类型存储在 Record 的值列表中。如果字段在 schema 中,接收到的数据类型会与 schema 指定的数据类型比较。如果类型匹配,字段值直接使用。如果 schema 表明字段应为不同类型,该 Controller Service 会尝试把数据强制转换为 schema 指定的类型。如果字段无法强制转换为指定类型,会抛出异常。

尝试把字段值从一种数据类型强制转换为另一种时,适用以下规则:

  • 任何数据类型都可以强制转换为 String 类型。
  • 任何数值数据类型(Int、Long、Float、Double)都可以强制转换为 其他任何数值数据类型。
  • 任何数值都可以强制转换为 Date、Time 或 Timestamp 类型,前提是把 Long 值视为自纪元(1970 年 1 月 1 日 GMT 午夜)以来的毫秒数。
  • 如果 String 值的格式匹配配置的 "Date Format"、"Time Format" 或 "Timestamp Format",它可以强制转换为 Date、Time 或 Timestamp 类型。
  • 如果值是合适的类型,String 值可以强制转换为数值。例如,String 值 8 可以强制转换为任何数值类型。但 String 值 8.2 可以强制转换为 Double 或 Float 类型,不能转换为 Integer。
  • "true" 或 "false"(不区分大小写)的 String 值可以强制转换为 Boolean 值。
  • 非空的 String 值可以强制转换为 Char 类型。如果 String 包含多个字符,使用第一个字符,其余字符被忽略。

尝试把值从一种数据类型强制转换为另一种时,如果上述规则都不适用, 强制转换会失败并抛出异常。

Schema 访问策略

除了从属性值获取 schema 或从 Schema Registry 访问等常见的 Schema 访问策略,ProtobufReader Controller Service 还提供另一种名为 "Generate from Proto file" 的访问策略。使用该策略时,Reader 会从所提供的 '.proto' 文件和 Message 类型生成 Record Schema。当用户不想手动创建 schema 或不需要类型强制转换时,推荐使用该策略。

Protobuf Any 字段类型

Protocol Buffers 提供了称为 Well-Known Types 的更多 Message 类型。这些是额外提供的消息,定义了复杂的结构类型和标量类型的 包装器。Any 类型是这些 Well-Known Types 之一,用于存储任意序列化的 Message 以及描述该序列化 Message 类型的 URL。由于 Message 类型和嵌入的 Message 只有在 Any Message 已填充数据时才可用,ProtobufReader 需要在数据转换时进行该 Message 处理。该 Reader 能够为 Any 字段中嵌入的 Message 生成 schema,并在结果 Record schema 中替换它。

示例

有一个名为 'TestMessage' 的 Message,只有一个 Any 类型的字段。另有一个名为 'NestedMessage' 的 Message,我们想把它作为序列化 Message 添加到 'anyField' 的值中。

message Any {
    string type_url = 1;
    bytes value = 2; 
}

message TestMessage {
    google.protobuf.Any anyField = 3; 
}

message NestedMessage {
    string field_1 = 1;
    string field_2 = 2;     
    string field_3 = 3;
}

``

普通数据转换下,结果如下:

{
  anyField: {
    type_url: "type.googleapis.com/NestedMessage"
    value: [
      84,
      101,
      115,
      116,
      32,
      98,
      121,
      116,
      101,
      115
    ]
  }
}

Protobuf Reader 用处理后的嵌入 Message 替换 Any Message 字段后的结果:

{
  anyField: {
    field_1: "value 1",
    field_2: "value 2",
    field_3: "value 3"
  }
}