如何用Apache NiFi表达式语言从CSV提取正则匹配值并新增字段
解决方案:用UpdateRecord从CSV字段提取数值并新增latitude字段
针对你的需求,最直接的方案是正确配置UpdateRecord处理器的表达式语言,无需额外引入ExtractText,以下是具体步骤:
1. UpdateRecord核心配置
- 保持已配置的
CSVReader和CSVRecordSetWriter不变,确保input_schema已正确包含description字段 - Update Strategy选择
Update if Not Null(避免为无匹配值的记录生成空的latitude字段,若需要保留空字段可选Always Update) - 在User-Defined Properties中新增字段映射:
- 键:
latitude - 值:
${description:replaceRegex('.*?(\d+\.\d+).*', '$1'):default('')}
- 键:
关键说明:
- 正则
.*?(\d+\.\d+).*采用非贪婪匹配(.*?)捕获第一个符合格式的小数数值,$1表示引用捕获到的数值内容 - 后缀
:default('')用于处理无匹配值的情况,可根据需求替换为'N/A'或'null' - 如果需要同时匹配整数(如
12345),可将正则调整为.*?(\d+(\.\d+)?).*
2. 排查之前replaceRegex失效的原因
你之前用replaceRegex未得到预期结果,大概率是正则写法问题:
- 若直接写
${description:replaceRegex('\d+\.\d+', '$0')},只会替换匹配到的数值部分,而非提取出数值作为新字段的值 - 必须通过
.*?和.*包裹捕获组,将整个description字段内容替换为捕获到的目标数值
3. 备选方案:JoltTransformRecord
如果需要更复杂的字段转换逻辑,可改用JoltTransformRecord处理器,Jolt规范示例如下:
[ { "operation": "modify-overwrite-beta", "spec": { "latitude": "${description:replaceRegex('.*?(\\d+\\.\\d+).*', '$1'):default('')}" } } ]
该方案原理与UpdateRecord一致,适合多字段联动转换的场景。
内容的提问来源于stack exchange,提问作者Jelly
相关产品推荐
相关产品推荐

