Pentaho PDI:上一行计算字段的最终值

时间:2015-08-31 11:59:25

标签: pentaho kettle pdi

我尝试使用Analytik Query步骤访问上一行的某些计算字段。事实证明,这些行都是并行计算的,并且访问前一行的字段可以获得它们在处理过程中的当前值,这是一种随机的。似乎无法获得前一行字段的 最终 值。或者除了Analytik Query步骤之外还有其他方法吗?我想我只需要一个复选框“等待以前的行完成”......

我需要这个:我正在处理与时间有关的数据并进行状态识别。当我当前处于状态A时,我在处理状态时对数据做其他事情。所以我需要知道前一个数据行的状态(在转换结束之前确定)。

可以做到Excel真的很容易,所以我想在PDI中必须有一些方法。 : - )

感谢您的帮助!

3 个答案:

答案 0 :(得分:1)

如果我已正确理解您的问题,您可以尝试使用Block this step until steps finish。此步骤将一直等到对话框中指定的所有步骤副本都完成。阅读链接了解更多信息。

希望这会有所帮助:)

答案 1 :(得分:0)

我相信可以使用用户定义的Java类(UDJC)步骤来解决它。 如果在处理行之前对行进行排序,则 Sort By 步骤将等待默认设置的最后一行。

这是为每个输入行编写输出行的最基本示例。使用用户定义的Java类步骤时要记住的一件重要事情是,它们会重写您的整个数据集,因此需要仔细考虑,特别是如果您回顾之前的事情行。我希望这有点帮助。

// A class member that stores the previous row:
public Object[] previousRow;
public boolean processRow(StepMetaInterface smi, StepDataInterface sdi) 
    throws KettleException  {   

    // Fetching row:
    Object[] r = getRow();
    // Check if r is null:
    if (r == null) {
      setOutputDone();
      return false;
    }
    // Get some field's value:
    String someFieldValue = get(Fields.In, "someFieldName").getString(r);

    // Log value if you want:
    logBasic("current field value is " + someFieldValue);

    // Generate an output row object:
    Object[] outputRow = RowDataUtil.createResizedCopy(r, data.outputRowMeta.size());

    // Modify row's field values if needed:
    get(Fields.Out, "someFieldName").setValue(outputRow, "a modified value here");

    // Write row:
    putRow(data.outputRowMeta, outputRow);
    // Assign current row to previous row:
    previousRow = r;
    return true;
}

修改 关于PDI的一个更重要的事项 - 通过阻止步骤或排序依据步骤的阻止方法是通过检查行集而不是单个来完成的行即可。 如何验证?

右键单击 - >转换设置 - >其他 - > 行集中的行数

默认值为10000行。 PDI开发人员经常通过使用其中一个阻塞步骤来创建死锁,其行集大小与其数据量不匹配 - 请记住这一点。

答案 2 :(得分:0)

使用“识别流中的最后一行”& “过滤行”转换。第一个转换检查它是否是最后一行并返回一个布尔值,后一个转换可用于根据返回的布尔值过滤记录。