如何用Pentaho Spoon 6 JSON Input处理带一对多嵌套的JSON文件
PDI解析嵌套JSON一对多关联的解决方案
核心思路
靠保留父记录唯一标识,结合PDI的JSON输入和拆分字段组件,搞定子数组(People)和对应设备的精准关联,同时处理空数组的情况。
具体操作步骤
1. 用JSON输入组件一次性提取父级字段和嵌套数组
- 组件配置:
- 数据源选你的JSON文件/数据流
- 路径设为
$.value[*],遍历所有设备记录 - 字段映射:
- 必提父级唯一标识:
Id(路径写Id),这是后续关联的核心主键 - 提取其他设备字段:比如
InvHostName、InvDomain、InvStatus.Description,按JSON实际层级填路径就行 - 提取嵌套数组
People:路径写People,字段类型选JSON,保留完整的子数组结构
- 必提父级唯一标识:
2. 拆分People数组为独立人员记录
加个拆分字段组件处理People字段:
- 选要拆分的字段:
People - 拆分类型选JSON数组
- 拆分后字段前缀设为
person_,自动生成person_Role.Description、person_Id、person_Email这类字段 - 关键:勾选仅拆分非空数组,避免空数组生成多余空行
3. 处理无关联人员的设备记录
如果要保留没有人员的设备记录,这么搞:
- 加个
计算器组件,新增字段has_people,表达式写!isEmpty(People) - 用
分支组件分流:has_people=N的记录直接输出(保留原设备字段),has_people=Y的走拆分后的流程,最后把两个分支的结果合并
4. 10万+记录的性能优化
- 关掉JSON输入组件的预览功能,别让内存爆了
- 调整PDI的JVM内存,比如在
spoon.bat/spoon.sh里改-Xmx参数,设成-Xmx8G(根据服务器配置调整) - 用流式处理,别一次性把全量数据加载到内存里
避坑提醒
- 绝对不能分开解析父级和子级再关联,不然会出现笛卡尔积(所有人员记录重复到每台设备上),必须在同一个JSON输入步骤里同时提取父级字段和子数组,再拆分
- 一定要保留设备的
Id字段,拆分后每条人员记录都会自动带上对应的设备Id,确保关联正确
内容的提问来源于stack exchange,提问作者Levi Lippincott
相关产品推荐
相关产品推荐

