如何在NiFi中将JSON数组转换为多份CSV文件,是否需改用JoltTransformJSON
现有流程优化建议
你当前的流程可以正常跑通,但SplitJson步骤是冗余的,ConvertRecord本身支持直接处理完整JSON数组,去掉拆分步骤可以避免生成大量小流文件,大幅提升处理效率。
为不同CSV配置属性与字段的方法
你不需要在同一个ConvertRecord内输出三份CSV,正确的做法是将拿到完整data数组的流文件分成三个并行处理分支,每个分支对应一份CSV的转换逻辑:
- 每个分支配置独立的
CsvRecordSetWriter,每个Writer的Schema仅保留对应CSV需要的字段即可。注意contact是数组类型,需要在JsonTreeReader的配置项里把Array Handling设置为Concatenate with Separator,分隔符填逗号,就能把["Phone","Email"]转成Phone,Email格式的字符串写入CSV。 - 每个
ConvertRecord后面接UpdateAttribute处理器,给对应CSV的流文件添加自定义属性,比如给第一份加csv.type=base_info,第二份加csv.type=contact_info,第三份加csv.type=work_info,后续存储或路由时直接调用这些属性即可,比如PutFile的Filename属性可以配置为${csv.type}_${UUID()}.csv,实现不同CSV的区分命名。
是否需要改用JoltTransformJSON
两种方案可以按需选择:
- 如果你的字段映射逻辑长期固定,没有额外复杂转换需求,现有
ConvertRecord方案完全够用,不需要引入Jolt,性能反而更优。 - 如果你后续需要处理更复杂的嵌套结构打平、字段值计算、规则频繁调整的场景,Jolt会更灵活。你可以给每个分支前置一个
JoltTransformJSON处理器,编写对应规则过滤出需要的字段,再转CSV,规则调整时只需改Jolt规范即可,不需要动Reader和Writer的Schema配置。
以下是第一份CSV对应的Jolt规则示例:
[ { "operation": "shift", "spec": { "data": { "*": { "ID": "[&1].ID", "Owner": "[&1].Owner", "address": "[&1].address" } } } } ]
执行完这个Jolt后输出的就是仅包含三个目标字段的JSON数组,直接用ConvertRecord转CSV即可,不需要额外配置Schema过滤字段。
内容的提问来源于stack exchange,提问作者likeGreen
相关产品推荐
相关产品推荐

