在NiFi中ValidateRecord
和ConvertRecord
处理器的理解和功能方面,我需要帮助。
我的要求
我有一个具有各种属性的JSON流文件内容,并且很少有字段是必填字段,很少是可选字段,也很少是timestamp字段,并且很少是double类型。 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"]
}]
}
字段结果应具有PASS或FAIL值,并且product和test_station_name可以具有最大长度限制,并且默认值不为“ null”的字段是必需的。
从源头来看,客户端应用程序可以在json中发送任何属性集,而我正在尝试通过jsonreader和jsonwriter使用validaterecord来验证记录,然后使用convertrecord根据架构适当地转换json。
我可以看到NiFi能够检测字段名称并能够针对数据类型(字符串,双精度和时间戳记)执行验证,但不会无效 1.记录除PASS或FAIL以外的结果属性的枚举值 2.也不会使product和test_station_name字段的记录长度大于架构中定义的最大长度的记录无效。 3.同样,即使JSON没有强制字段的属性和值,validate记录也将这些字段考虑为“ null”。 而是所有JSON记录都已成功验证。
问题
NiFi ValidateRecord
和ConvertRecord
可用于通过上述某些验证规则将传入的JSON验证并转换为传出的json。如果没有,是否有替代方案可以使用groovy脚本根据模式对传入的json执行此类验证和转换。
请提出建议。任何帮助将不胜感激。
答案 0 :(得分:1)
1)当前,Avro模式中的枚举在NiFi的内部记录模式中转换为字符串类型,因此这就是传递任何值的原因。 NiFi的记录架构中需要有一个枚举类型,该枚举类型从Avro架构中捕获了允许的值。
2)我在Avro规范中找不到关于maxLength的任何信息-https://avro.apache.org/docs/current/spec.html这是真的吗?如果是的话,NiFi可以考虑将其合并。
3)如果一个字段没有值,那么它应该是无效的,除非该字段的类型是带有“ null”的联合,例如“ type”:[“ null”,“ double”],那表示该字段不是必需字段,并且可以为null或double。