我相信它可以通过使用用户定义的 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 开发人员经常通过使用不适合其数据量的行集大小的阻塞步骤之一来创建死锁 - 请记住这一点。