NiFi新手求助:无需自定义脚本实现单条CSV转多条JSON数组记录
无需自定义脚本的NiFi实现方案
完全可以用NiFi自带的处理器组合实现你的需求,不需要编写自定义脚本,具体步骤如下:
步骤1:解析CSV为结构化Record
使用ConvertRecord处理器完成CSV到结构化Record的转换:
- 配置记录读取器为
CSVReader:开启"Has Header Row",设置分隔符为逗号,确保id列被正确识别为字段 - 配置记录写入器为
JSONRecordSetWriter:选择输出单条Record为JSON对象(而非数组),方便后续处理
这一步会把原始CSV的每一行转换成一条独立的JSON格式Record,例如:
{"id":"00abc","attribute1":"100","attribute2":"yes","attribute3":"up"}
步骤2:拆分单条Record为多条属性条目
使用JoltTransformRecord处理器,通过Jolt转换规则将单条Record拆分为多个符合要求的属性对象:
- 配置记录读取器为
JSONReader,匹配ConvertRecord输出的JSON格式 - 配置记录写入器为
JSONRecordSetWriter,设置输出为JSON数组 - 核心配置Jolt Specification,使用以下规则:
[ { "operation": "shift", "spec": { "id": "primary_key", "attribute1": "[0].field_value", "attribute2": "[1].field_value", "attribute3": "[2].field_value", "#attribute1": "[0].field_name", "#attribute2": "[1].field_name", "#attribute3": "[2].field_name" } }, { "operation": "shift", "spec": { "*": { "@(2,primary_key)": "[&1].primary_key", "*": "[&1].&" } } } ]
该规则会将单条Record转换为包含3个对象的数组,每个对象对应一个属性条目,例如:
[ {"primary_key":"00abc","field_name":"attribute1","field_value":"100"}, {"primary_key":"00abc","field_name":"attribute2","field_value":"yes"}, {"primary_key":"00abc","field_name":"attribute3","field_value":"up"} ]
步骤3:聚合所有条目并生成最终JSON结构
- 使用SplitRecord处理器将Jolt输出的数组拆分为单个JSON对象(每个对象对应一条属性条目)
- 使用MergeContent处理器将所有单个对象聚合为一个JSON数组:
- 设置"Merge Strategy"为"Bin-Packing Algorithm"
- 设置"Delimiter"为逗号
- 设置"Header"为
[,"Footer"为]
- 使用ReplaceText处理器为聚合后的数组添加外层结构:
- 设置"Search Value"为
(.*)(匹配整个数组内容) - 设置"Replacement Value"为:
- 设置"Search Value"为
{ "type": "record", "result": { "fields": $1 } }
通过以上三步,就能完全实现你需要的输出格式,全程无需编写自定义脚本。
内容的提问来源于stack exchange,提问作者Nick McGurk
相关产品推荐
相关产品推荐

