ValidateRecord Processor
描述
根据给定架构验证传入 FlowFile 的记录。所有符合架构的记录路由到 'valid' 关系,不符合架构的记录路由到 'invalid' 关系。
标签
属性
| 名称 | 默认值 | 可选值 | 描述 |
|---|---|---|---|
| Record Reader | | 控制器服务 API:RecordReaderFactorycn.org.acal.lynxus-lynxus-standard-services-api-nar-2.11.8 | 指定用于读取传入数据的 Controller Service |
| Record Writer | | 控制器服务 API:RecordSetWriterFactorycn.org.acal.lynxus-lynxus-standard-services-api-nar-2.11.8 | 指定用于写入记录的控制器服务。无论控制器服务的 Schema 访问配置如何,用于验证记录的 Schema 都将用于写入有效结果。 |
| Record Writer for Invalid Records | | 控制器服务 API:RecordSetWriterFactorycn.org.acal.lynxus-lynxus-standard-services-api-nar-2.11.8 | 如果指定,此控制器服务将用于写入所有无效记录。如果未指定,则将使用 \"Record Writer\" 属性指定的写入器以及用于读取输入记录的 Schema。这很有用,例如,当配置的 Record Writer 无法写入不符合其 Schema 的数据时(如 Avro 的情况),或者希望在将有效记录转换为另一种格式的同时保持无效记录的原始格式。 |
| Schema Access Strategy | reader-schema |
| 指定如何获取应用于验证记录的模式 |
| Schema Registry | | 控制器服务 API:SchemaRegistrycn.org.acal.lynxus-lynxus-standard-services-api-nar-2.11.8 | 指定用于架构Registry的Controller Service |
| Schema Name | ${schema.name} | 指定要在架构Registry属性中查找的架构名称 支持表达式语言:是(使用 FlowFile 属性与环境/系统变量求值) | |
| Schema Branch | | 指定在 Schema Registry 属性中查找 Schema 时使用的分支名称。如果选择的 Schema Registry 不支持分支,则此值将被忽略。 支持表达式语言:是(使用 FlowFile 属性与环境/系统变量求值) | |
| Schema Version | | 指定在 Schema Registry 中查找 Schema 的版本。如果未指定,则检索 Schema 的最新版本。 支持表达式语言:是(使用 FlowFile 属性与环境/系统变量求值) | |
| Schema Text | ${avro.schema} | Avro 格式的架构文本 支持表达式语言:是(使用 FlowFile 属性与环境/系统变量求值) | |
| Allow Extra Fields | true |
| 如果传入数据包含 Schema 中不存在的字段,此属性决定记录是否有效。如果为 true,记录仍然有效。如果为 false,记录将因多余字段而无效。 |
| Strict Type Checking | true |
| 如果传入数据中某条记录的字段类型不正确,此属性决定如何处理该记录。如果为 true,该记录将被视为无效。如果为 false,该记录将被视为有效,并且字段将被强制转换为正确的类型(如果可能,根据 Record Writer 支持的类型强制转换规则)。此属性控制数据如何根据验证 Schema 进行验证。 |
| Force Types From Reader Schema | false |
| 如果启用,处理器将把每个字段强制转换为读取器 Schema 中指定的类型。如果字段值无法强制转换为该类型,则该字段将被跳过(不会从输入数据中读取),因此不会出现在输出中。如果未启用,则每个字段都会出现在输出中,但其类型可能与 Schema 中指定的不同。详情请参阅处理器帮助中的附加详情页面。此属性控制指定 Record Reader 如何读取数据。 |
| Validation Details Attribute Name | | 如果指定,当发生验证错误时,将使用此属性名称来记录详细信息。字符数将受到'最大验证详情长度'属性的限制。 支持表达式语言:是(使用 FlowFile 属性与环境/系统变量求值) | |
| Maximum Validation Details Length | 1024 | 指定验证详情值可以具有的最大字符数。超出最大值的字符将被截断。此属性仅在设置了'验证详情属性名称'时使用。 支持表达式语言:是(使用 FlowFile 属性与环境/系统变量求值) |
关系 (Relationships)
| 名称 | 描述 | 自动终止 |
|---|---|---|
failure | 如果出于任何原因无法读取、验证或写入记录,原始 FlowFile 将被路由到此关系 | 否 |
invalid | 根据架构无效的记录将被路由到此关系 | 否 |
valid | 根据模式有效的记录将被路由到此关系 | 否 |
写入的 FlowFile 属性
| 名称 | 描述 |
|---|---|
mime.type | 将 mime.type 属性设置为Record Writer指定的 MIME 类型 |
record.count | FlowFile 中路由到关系的记录数 |
状态管理
该组件不存储状态。
受限 (Restricted)
该组件不受限。
输入要求
该组件要求有传入连接。
详细说明
ValidateRecord
Force Types From Reader's Schema 属性效果的示例
该 Processor 首先使用指定的 Record Reader(使用某个 schema)读取传入 FlowFile 中的数据。 然后,根据 Schema Access Strategy 属性的值,Processor 可以使用 Reader 的 schema, 也可以使用另一个 schema 来校验数据。之后,Processor 使用指定的 Record Writer 把数据写入 输出 FlowFile。如果数据合法,Writer 使用校验用的 schema;如果数据不合法,Writer 使用 Reader 的 schema。Force Types From Reader's Schema 属性影响第一步:从传入 FlowFile 读取数据时,应多么严格地应用 Reader 的 schema。通过影响数据的读取方式,该属性的值 也会影响 ValidateRecord Processor 的输出,以及输出是被转发到 valid 还是 invalid Relationship。下面两个示例中,该属性的值对输出产生了显著影响。
在两个示例中,输入都是 XML 格式,输出都是 JSON。示例中假设读取、校验和写入使用同一个 schema。
示例 1
Schema:
{
"namespace": "lynxus",
"name": "test",
"type": "record",
"fields": [
{
"name": "field1",
"type": "string"
},
{
"name": "field2",
"type": "string"
}
]
}
输入:
<test>
<field1>
<sub_field>content</sub_field>
</field1>
<field2>content_of_field_2</field2>
</test>
Force Types From Reader's Schema = true 时的输出(转发到 invalid Relationship):
[
{
"field2": "content_of_field_2"
}
]
Force Types From Reader's Schema = false 时的输出(转发到 invalid Relationship):
[
{
"field1": {
"sub_field": "content"
},
"field2": "content_of_field_2"
}
]
可以看到,由于输入数据与提供的 Avro schema 不匹配,两种情况下 FlowFile 都被转发到 invalid Relationship。区别在于:如果 Force Types From Reader's Schema = true, 输出中只出现符合 schema 的字段;如果 Force Types From Reader's Schema = false, 无论字段是否符合 schema,都会出现在输出中。
示例 2
Schema:
{
"namespace": "lynxus",
"name": "test",
"type": "record",
"fields": [
{
"name": "field1",
"type": {
"type": "array",
"items": "string"
}
},
{
"name": "field2",
"type": {
"type": "array",
"items": "string"
}
}
]
}
输入:
<test>
<field1>content_1</field1>
<field2>content_2</field2>
<field2>content_3</field2>
</test>
Force Types From Reader's Schema = true 时的输出(转发到 valid Relationship):
[
{
"field1": [
"content_1"
],
"field2": [
"content_2",
"content_3"
]
}
]
Force Types From Reader's Schema = false 时的输出(转发到 invalid Relationship):
[
{
"field1": "content_1",
"field2": [
"content_2",
"content_3"
]
}
]
Schema 期望两个字段(field1 和 field2),类型都是 ARRAY。field1 在输入 XML 文档中 只出现了一次。如果 Force Types From Reader's Schema = true,Processor 会强制该 字段转换为符合 schema 的类型,即把它放入一个只有一个元素的数组中。由于这种类型强制转换 可以完成,输出被路由到 valid Relationship。如果 Force Types From Reader's Schema = false,Processor 不会尝试类型强制转换,因此 field1 在输出中显示为单个值。 按 schema,Processor 期望 field1 是一个数组,但收到的是单个元素,所以输出被路由到 invalid Relationship。
是否符合 schema(以及被路由到 valid 还是 invalid Relationship)与用哪个 Writer 产生 ValidateRecord Processor 的输出无关。假设使用与示例 2 相同的 schema 和输入,但用 XMLRecordSetWriter 代替 JsonRecordSetWriter 产生输出。 无论 Force Types From Reader's Schema = true 还是 = false,输出都是:
<test>
<field1>content_1</field1>
<field2>content_2</field2>
<field2>content_3</field2>
</test>
不过,如果 Force Types From Reader's Schema = true,该输出被路由到 valid Relationship;如果 Force Types From Reader's Schema = false,则被路由到 invalid Relationship。