Pentaho中实现依赖前序转换输出的连续数值计算方案咨询
Pentaho 累计减法数据处理实现方案
一、单转换实现(推荐,无需拆分流程)
这种方式无需拆分转换,一步完成所有逻辑,更高效易维护:
读取双数据源
- 用
表输入组件读取数据库中的Id和初始quantity(可将字段重命名为initial_quantity避免后续混淆),确保每个Id仅保留一条初始记录(若数据库存在重复,可通过分组(内存分组)组件取第一条/最新值)。 - 用
XML输入组件读取目标XML文件:设置循环节点为XML中行数据的路径(如/rows/row),映射解析出Id和Y字段;再用增加序列组件给每条XML记录添加seq字段,保证同一Id内的Y值按原始XML顺序处理。
- 用
关联与排序
- 用
查找记录(流查询)组件,将XML数据流作为主数据流,数据库初始数据作为查询流,按Id关联,让每条XML记录带上对应Id的initial_quantity。 - 用
排序记录组件,按Id升序、seq升序排序,确保同一Id的记录按计算顺序排列。
- 用
累计减法计算
- 添加
JavaScript脚本组件,编写逻辑维护每个Id的当前quantity值:// 初始化全局对象存储各Id的当前quantity if (typeof currentQtys === 'undefined') { var currentQtys = {}; } // 获取当前行数据 var row = getRow(); var id = row.Id; var y = row.Y; var initQty = row.initial_quantity; // 计算当前quantity if (!currentQtys[id]) { currentQtys[id] = initQty - y; } else { currentQtys[id] = currentQtys[id] - y; } // 输出结果字段(需提前在组件中定义输出字段:Id、current_quantity) putRow([id, currentQtys[id]]); - 可通过
文本文件输出或表输出组件将最终结果写入目标位置。
- 添加
二、多转换拆分实现(适配你的初始思路)
若坚持拆分两个转换,可按以下方式处理跨转换的文件输入:
转换1:生成单Id独立XML文件
- 用
XML输入组件读取原始XML文件,解析出Id和Y字段。 - 用
分组(内存分组)组件按Id分组,将同一Id的Y值归为一组。 - 用
XML输出组件,在「文件名」设置中使用变量${Id}.xml(如./output/${Id}.xml),即可为每个Id生成单独的XML文件。
转换2:批量读取单Id XML并计算
- 用
获取文件名组件,设置文件路径为转换1的输出目录(如./output/*.xml),获取所有生成的XML文件路径。 - 用
正则表达式组件从文件名中提取Id:匹配规则设为(\d+)\.xml,将捕获的分组映射为Id字段。 - 用
XML输入组件读取每个XML文件的Y字段,同时结合增加序列保证同一Id内的Y值顺序。 - 后续关联数据库初始数据、排序、累计计算的步骤,与单转换实现中的步骤2-3完全一致。
内容的提问来源于stack exchange,提问作者Ferb
相关产品推荐
相关产品推荐

