Apache nifi Nifi validaterecord和convertrecord使用AvroschemareRegistry验证和转换json记录
我需要帮助理解NiFi中Apache nifi Nifi validaterecord和convertrecord使用AvroschemareRegistry验证和转换json记录,apache-nifi,Apache Nifi,我需要帮助理解NiFi中ValidateRecord和ConvertRecord处理器的功能 我的要求 我有一个JSON流文件内容,它具有各种属性,其中很少有字段是必需的,很少有字段是可选的,也很少有字段是时间戳字段,很少有双精度类型。在LOV中,有些字段的值应为 我使用了AvroSchemaRegistry和下面的模式定义: { "namespace": "nifi", "name": "test_json", "type": "record", "fields
ValidateRecord
和ConvertRecord
处理器的功能
我的要求
我有一个JSON流文件内容,它具有各种属性,其中很少有字段是必需的,很少有字段是可选的,也很少有字段是时间戳字段,很少有双精度类型。在LOV中,有些字段的值应为
我使用了AvroSchemaRegistry
和下面的模式定义:
{
"namespace": "nifi",
"name": "test_json",
"type": "record",
"fields": [{
"name": "sn",
"type": "string"
}, {
"name": "result",
"type": {
"name": "Result",
"type": "enum",
"symbols": ["PASS", "FAIL"]
}
}, {
"name": "product",
"type": "string",
"maxLength": 8
}, {
"name": "test_station_name",
"type": "string",
"maxLength": 32
}, {
"name": "station_id",
"type": "string"
}, {
"name": "mac_address",
"type": "string"
}, {
"name": "start_time",
"type": {
"type": "string",
"logicalType": "timestamp-millis"
}
}, {
"name": "stop_time",
"type": {
"type": "string",
"logicalType": "timestamp-millis"
}
}, {
"name": "f_p_dip_wave",
"type": ["null", "double"]
}, {
"name": "f_p_dip_depth",
"type": ["null", "double"]
}, {
"name": "f_p_dip_height",
"type": ["null", "double"]
}, {
"name": "radius",
"type": ["null", "double"]
}, {
"name": "diameter",
"type": ["null", "double"]
}, {
"name": "gain_cavity_offset_nm",
"type": ["null", "double"]
}]
}
字段结果应具有通过值或失败值,并且产品和测试站名称可以对值具有最大长度限制,并且没有默认值“null”的字段是必需的
源端,客户端应用程序可以发送json中的任何属性集,我正在尝试使用validaterecord,使用jsonreader和jsonwriter验证记录,然后使用convertrecord根据模式适当地转换json
我可以看到,NiFi能够检测字段名,并且能够对数据类型(字符串、双精度和时间戳)执行验证,但不会使其无效
1.结果属性的基于记录的枚举值,而不是通过或失败
2.还不得使产品和测试站名称字段的记录长度大于架构中定义的最大长度的记录无效。3.此外,即使JSON没有强制字段的属性和值,validate record也会考虑这些字段的“null”。
相反,所有JSON记录都得到了成功验证
问题
NiFiValidateRecord
和ConvertRecord
可用于验证传入JSON并将其转换为传出JSON,上面解释了一些验证规则。如果没有,是否有其他方法可以使用groovy脚本根据模式对传入的json执行此类验证和转换
请建议。非常感谢您的帮助。1)目前,Avro模式中的枚举在NiFi的内部记录模式中被转换为字符串类型,这就是传递任何值的原因。NiFi的记录模式中需要有一个枚举类型,它从Avro模式中捕获允许的值
2) 我在Avro规范中找不到关于maxLength的任何信息-这是真的吗?如果是,那么NIFI可以考虑合并它。
3) 如果一个字段没有值,那么它应该是无效的,除非该字段的类型是带有“null”的并集,例如“type”:[“null”,“double”],这意味着该字段不是必需的,并且允许为null或double