如何在NiFi中实现字段值与指定集合的匹配校验?
NiFi校验字段值是否属于指定集合的实现方案
以下几种方法可以实现你需要的字段集合校验逻辑:
方法1:QueryRecord处理器
这是最直观的方式,用SQL过滤逻辑实现:
- 配置与数据格式匹配的Record Reader和Record Writer(如CSVReader、JsonRecordSetWriter)
- 在处理器的查询语句中写入:
SELECT * FROM flowfile WHERE AGE IN (7,8,9) AND CLASS IN (2,3,4) - 处理器会自动输出两个关系:
matched对应有效记录,unmatched对应无效记录,直接路由即可。
方法2:ScriptedRecordProcessor处理器
适合需要更灵活逻辑的场景,以Groovy脚本为例:
- 配置Record Reader和Record Writer后,在Script栏写入:
def record = recordReader.nextRecord() while (record != null) { def age = record.getAsInteger("AGE") def clazz = record.getAsInteger("CLASS") def isValid = ([7,8,9].contains(age) && [2,3,4].contains(clazz)) if (isValid) { recordWriter.write(record) session.transfer(recordWriter.result, REL_VALID) } else { session.transfer(record, REL_INVALID) } record = recordReader.nextRecord() } - 运行后,处理器会将记录分别发往
VALID和INVALID关系。
方法3:ValidateRecord处理器(补充你未找到的配置方式)
ValidateRecord完全可以实现该需求,关键是配置自定义校验规则:
方式A:通过Schema添加枚举约束
如果使用Avro等支持约束的Schema,直接在字段定义中指定允许的值:
{ "type": "record", "name": "StudentRecord", "fields": [ {"name": "AGE", "type": "int", "validations": {"in": [7,8,9]}}, {"name": "CLASS", "type": "int", "validations": {"in": [2,3,4]}} ] }
将该Schema配置到Record Reader中,ValidateRecord会自动校验字段是否在指定集合内。
方式B:Scripted Validator联合校验
如果需要更复杂的联合逻辑,选择Scripted Validator,写入Groovy脚本:
def age = record.getAsInteger("AGE") def clazz = record.getAsInteger("CLASS") return ([7,8,9].contains(age) && [2,3,4].contains(clazz))
配置后,ValidateRecord会将符合规则的记录发往valid关系,不符合的发往invalid。
内容的提问来源于stack exchange,提问作者user2742712
相关产品推荐
相关产品推荐

