Nifi validaterecord和convertrecord使用avroschemaregistry验证和转换json记录

时间:2018-08-19 07:16:01

标签: apache-nifi

在NiFi中ValidateRecordConvertRecord处理器的理解和功能方面,我需要帮助。

我的要求

我有一个具有各种属性的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 ValidateRecordConvertRecord可用于通过上述某些验证规则将传入的JSON验证并转换为传出的json。如果没有,是否有替代方案可以使用groovy脚本根据模式对传入的json执行此类验证和转换。

请提出建议。任何帮助将不胜感激。

1 个答案:

答案 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。