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

Pentaho中实现依赖前序转换输出的连续数值计算方案咨询

Pentaho 累计减法数据处理实现方案

一、单转换实现(推荐,无需拆分流程)

这种方式无需拆分转换,一步完成所有逻辑,更高效易维护:

  1. 读取双数据源

    • 用表输入组件读取数据库中的Id和初始quantity(可将字段重命名为initial_quantity避免后续混淆),确保每个Id仅保留一条初始记录(若数据库存在重复,可通过分组(内存分组)组件取第一条/最新值)。
    • 用XML输入组件读取目标XML文件:设置循环节点为XML中行数据的路径(如/rows/row),映射解析出Id和Y字段;再用增加序列组件给每条XML记录添加seq字段,保证同一Id内的Y值按原始XML顺序处理。
  2. 关联与排序

    • 用查找记录(流查询)组件,将XML数据流作为主数据流,数据库初始数据作为查询流,按Id关联,让每条XML记录带上对应Id的initial_quantity。
    • 用排序记录组件,按Id升序、seq升序排序,确保同一Id的记录按计算顺序排列。
  3. 累计减法计算

    • 添加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文件

  1. 用XML输入组件读取原始XML文件,解析出Id和Y字段。
  2. 用分组(内存分组)组件按Id分组,将同一Id的Y值归为一组。
  3. 用XML输出组件,在「文件名」设置中使用变量${Id}.xml(如./output/${Id}.xml),即可为每个Id生成单独的XML文件。

转换2:批量读取单Id XML并计算

  1. 用获取文件名组件,设置文件路径为转换1的输出目录(如./output/*.xml),获取所有生成的XML文件路径。
  2. 用正则表达式组件从文件名中提取Id:匹配规则设为(\d+)\.xml,将捕获的分组映射为Id字段。
  3. 用XML输入组件读取每个XML文件的Y字段,同时结合增加序列保证同一Id内的Y值顺序。
  4. 后续关联数据库初始数据、排序、累计计算的步骤,与单转换实现中的步骤2-3完全一致。

内容的提问来源于stack exchange,提问作者Ferb

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 07:47:30