You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 15:21:01