如何通过NiFi将SQL结果转换为含嵌套数组的目标JSON格式?
NiFi实现SQL结果分组嵌套JSON的步骤
针对你需要将平铺SQL记录按member_id、field2分组,把partnum、price、quantity整理为itemDetails嵌套数组的需求,用以下NiFi处理器组合就能实现:
1. 先将SQL查询结果转为结构化记录
用ExecuteSQL处理器获取SQL数据后,通过ConvertRecord把结果转换成Avro格式(Avro对后续聚合操作支持更稳定):
- Record Reader:选择
DatabaseRecordReader,自动映射SQL字段到结构化记录 - Record Writer:选择
AvroRecordSetWriter,输出Avro格式的批量记录
2. 按指定字段分组聚合
用MergeRecord处理器实现分组,把同一member_id+field2的记录合并,将partnum、price、quantity收集为数组:
- Record Reader:
AvroReader(读取上一步的Avro输出) - Record Writer:
AvroRecordSetWriter(保持结构化格式,方便后续转换) - 分组策略:选择
Bin by Attributes,添加分组属性为member_id和field2(注意字段名大小写要和SQL结果一致) - 聚合策略:选择
Merge Records,然后对partnum、price、quantity这三个字段,设置聚合方式为Collect List,这样每个分组内的对应字段会自动合并成数组
这一步完成后,输出的单分组记录结构大概是:
{ "member_id": "123", "field2": "abc", "partnum": ["P001", "P002"], "price": [10.5, 20.0], "quantity": [2, 5] }
3. 调整结构为目标嵌套JSON
用JoltTransformJSON处理器将数组字段组合成itemDetails对象数组,核心是配置Jolt转换规则:
- 选择
Chain模式,添加以下Shift操作规范(字段名请根据实际SQL结果调整大小写):
[ { "operation": "shift", "spec": { "member_id": "member_id", "field2": "field2", "partnum": "itemDetails[&1].partnum", "price": "itemDetails[&1].price", "quantity": "itemDetails[&1].quantity" } } ]
这个规则会把三个平行数组,按索引对应组合成itemDetails里的对象,最终输出符合需求的结构:
{ "member_id": "123", "field2": "abc", "itemDetails": [ {"partnum": "P001", "price": 10.5, "quantity": 2}, {"partnum": "P002", "price": 20.0, "quantity": 5} ] }
4. (可选)转为JSON输出
如果需要最终输出JSON格式,再用一次ConvertRecord,选择AvroReader和JsonRecordSetWriter即可。
注意事项
- 所有处理器的字段名要保持一致,注意SQL返回的字段是大写(如
MEMBER_ID)还是小写,配置时要对应 MergeRecord要确保分组属性的类型匹配(比如member_id是字符串还是数字),避免分组失败- Jolt规则可以根据实际字段名调整,比如字段是大写的话,把spec里的键改成
"MEMBER_ID": "member_id"即可
内容的提问来源于stack exchange,提问作者Albert
相关产品推荐
相关产品推荐

