ValidateRecord

文档中心 › 组件索引 › ValidateRecord

ValidateRecord Processor

类型全限定名:cn.org.acal.lynxus.processors.standard.ValidateRecord

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

描述

根据给定架构验证传入 FlowFile 的记录。所有符合架构的记录路由到 'valid' 关系,不符合架构的记录路由到 'invalid' 关系。

标签

recordschemavalidate

属性

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

名称默认值可选值描述
Record Reader控制器服务 API:
RecordReaderFactory
cn.org.acal.lynxus-lynxus-standard-services-api-nar-2.11.8
指定用于读取传入数据的 Controller Service
Record Writer控制器服务 API:
RecordSetWriterFactory
cn.org.acal.lynxus-lynxus-standard-services-api-nar-2.11.8
指定用于写入记录的控制器服务。无论控制器服务的 Schema 访问配置如何,用于验证记录的 Schema 都将用于写入有效结果。
Record Writer for Invalid Records控制器服务 API:
RecordSetWriterFactory
cn.org.acal.lynxus-lynxus-standard-services-api-nar-2.11.8
如果指定,此控制器服务将用于写入所有无效记录。如果未指定,则将使用 \"Record Writer\" 属性指定的写入器以及用于读取输入记录的 Schema。这很有用,例如,当配置的 Record Writer 无法写入不符合其 Schema 的数据时(如 Avro 的情况),或者希望在将有效记录转换为另一种格式的同时保持无效记录的原始格式。
Schema Access Strategyreader-schema
  • 使用读取器的 Schema — 用于验证数据的 Schema 由配置的 Record Reader 提供其 Schema 来确定。
  • 使用 'Schema Name' 属性 — 要使用的 Schema 名称由 'Schema Name' 属性指定。此属性的值用于在配置的 Schema Registry 服务中查找 Schema。
  • 使用 'Schema Text' 属性 — Schema 本身的文本由 'Schema Text' 属性指定。此属性的值必须是有效的 Avro Schema。如果使用表达式语言,则 'Schema Text' 属性的值在替换表达式后必须有效。
指定如何获取应用于验证记录的模式
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 Branch指定在 Schema Registry 属性中查找 Schema 时使用的分支名称。如果选择的 Schema Registry 不支持分支,则此值将被忽略。
支持表达式语言:是(使用 FlowFile 属性与环境/系统变量求值)
Schema Version指定在 Schema Registry 中查找 Schema 的版本。如果未指定,则检索 Schema 的最新版本。
支持表达式语言:是(使用 FlowFile 属性与环境/系统变量求值)
Schema Text${avro.schema}Avro 格式的架构文本
支持表达式语言:是(使用 FlowFile 属性与环境/系统变量求值)
Allow Extra Fieldstrue
  • true
  • false
如果传入数据包含 Schema 中不存在的字段,此属性决定记录是否有效。如果为 true,记录仍然有效。如果为 false,记录将因多余字段而无效。
Strict Type Checkingtrue
  • true
  • false
如果传入数据中某条记录的字段类型不正确,此属性决定如何处理该记录。如果为 true,该记录将被视为无效。如果为 false,该记录将被视为有效,并且字段将被强制转换为正确的类型(如果可能,根据 Record Writer 支持的类型强制转换规则)。此属性控制数据如何根据验证 Schema 进行验证。
Force Types From Reader Schemafalse
  • true
  • false
如果启用,处理器将把每个字段强制转换为读取器 Schema 中指定的类型。如果字段值无法强制转换为该类型,则该字段将被跳过(不会从输入数据中读取),因此不会出现在输出中。如果未启用,则每个字段都会出现在输出中,但其类型可能与 Schema 中指定的不同。详情请参阅处理器帮助中的附加详情页面。此属性控制指定 Record Reader 如何读取数据。
Validation Details Attribute Name如果指定,当发生验证错误时,将使用此属性名称来记录详细信息。字符数将受到'最大验证详情长度'属性的限制。
支持表达式语言:是(使用 FlowFile 属性与环境/系统变量求值)
Maximum Validation Details Length1024指定验证详情值可以具有的最大字符数。超出最大值的字符将被截断。此属性仅在设置了'验证详情属性名称'时使用。
支持表达式语言:是(使用 FlowFile 属性与环境/系统变量求值)

关系 (Relationships)

名称描述自动终止
failure如果出于任何原因无法读取、验证或写入记录,原始 FlowFile 将被路由到此关系否
invalid根据架构无效的记录将被路由到此关系否
valid根据模式有效的记录将被路由到此关系否

写入的 FlowFile 属性

名称描述
mime.type将 mime.type 属性设置为Record Writer指定的 MIME 类型
record.countFlowFile 中路由到关系的记录数

状态管理

该组件不存储状态。

受限 (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。