PDI/Kettle:避免文件创建或映射(子转换)执行

PDI/Kettle: avoid file creation or mapping (sub-transformation) execution

现在很清楚,转换的所有步骤都是并行执行的,并且没有办法在 Pentaho 中更改此行为。

鉴于此,我们有一个带有切换任务的场景,该任务检查特定字段(从文件名读取)并决定哪个任务(映射 - 子转换)将处理该文件。这是通用逻辑的一部分,在每个映射任务之前和之后,执行一些样板任务,如更新数据库记录、发送电子邮件等。

问题是:如果我们没有 "ACCC014" 个文件,则无法执行此转换。我知道这是不可能的,因为所有任务都是并行执行的,因此出现了第二个问题:在某些映射中,创建了 XML 文件。即使 Pentaho 使用空数据执行此任务,我们也无法找到避免创建 XML 输出文件的方法。

我们考虑过将此切换逻辑移动到作业中,因为理论上它是串行的,但没有发现可以进行这种区分的条件步骤。

我们还研究了元数据注入任务,但我们认为这不是可行的方法。每个子转换确实完成不同的工作。其中一些更新一些表,另一些写入文件,另一些在不同数据库之间移动数据。他们都接收一些文件作为输入和 return 一个 send_email 标志和一个消息字符串。没有别的。

有没有办法做到我们所愿?或者没有办法重用基于默认的部分逻辑 inputs/outputs?

编辑:添加 ACCC014 转换。是的,勾选了"Do not create file at start"选项。

您可以使用 Transformation Executor 步骤 (http://wiki.pentaho.com/display/EAI/Transformation+Executor) 以有条件地执行转换。虽然我没有真正使用过这一步,所以我不能说它的稳定性和性能。

主要改造:

像这样设置你的父转换:
关于 Injector 步骤:在 5.2 版本中,我无法获取在子转换中创建的字段,即使它们是在“结果行”选项卡上定义的,所以我不得不在 Injector 步骤中定义所有这些字段。 不确定,在当前版本中是否仍然需要。

转换执行器的可能调整:

  1. 您可能想要更改 Row grouping 选项卡上的 The number of rows to send to the transformation 值:将其设置为 0 以便 一次发送所有行,而不是重新执行转换 每 N 行。

  2. 如果您想读取子转换的输出,select“这 输出将包含执行后的结果行”选项,而 创建到后续步骤的跃点:

子变换:

这里您可能需要做的唯一更改是将映射输入和输出替换为 Get rows from resultCopy rows to result:

5.2 中的已知问题: 作业执行器似乎不是从“将行复制到结果”步骤读取子转换的输出,而是从最近创建的步骤读取。因此,如果您向子转换添加了一些步骤,请记住重新创建您希望从中读取输出的步骤:只是 select“复制行到结果”,剪切它,粘贴它返回并重新创建跃点。