1

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

我需要这个:我正在处理与时间相关的数据并进行状态识别。当我目前处于状态 A 时,我对我的数据执行其他操作,然后当我处于状态 B 时。所以我需要知道前一个数据行的状态(不是在我的转换结束之前确定的)。

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

谢谢你的帮助!

4

3 回答 3

1

如果我正确理解了您的问题,您可以尝试使用阻止此步骤直到步骤完成。此步骤将等待对话框中指定的所有步骤副本完成。阅读链接了解更多信息。

希望这可以帮助:)

于 2015-09-01T03:00:02.583 回答
0

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

这是为每个输入行编写输出行的最基本示例。在用户定义的 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 开发人员经常通过使用不适合其数据量的行集大小的阻塞步骤之一来创建死锁 - 请记住这一点。

于 2015-09-02T08:06:23.457 回答
0

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

于 2015-09-04T19:47:03.607 回答