【问题标题】:PDI/Kettle: avoid file creation or mapping (sub-transformation) executionPDI/Kettle:避免文件创建或映射(子转换)执行
【发布时间】:2016-10-27 13:40:41
【问题描述】:

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

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

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

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

我们还研究了元数据注入任务,但我们不认为这是要走的路。每个子转换都做了不同的工作。其中一些更新一些表,另一些写入文件,另一些在不同数据库之间移动数据。它们都接收一些文件作为输入并返回一个 send_email 标志和一个消息字符串。没有别的了。

有没有办法做我们愿意做的事?还是没有办法重用基于默认输入/输出的部分逻辑?

编辑:添加 ACCC014 转换。是的,“开始时不创建文件”选项被选中。

【问题讨论】:

  • 这些 xml 文件是由 XML 输出步骤创建的吗?回到 5.2,XML 输出步骤在“文件”选项卡上具有“开始时不创建文件”选项。你检查了吗?
  • 如果没有文件,为什么需要执行 ACCC014 转换?如果它有你想要的副作用,请将它们分解到另一个转换中。
  • @user4637357 是的,例如,通过 ACCC014 转换创建了一个 XML 文件。我检查了“不要在开始时创建文件”,但问题是无论如何都会执行转换,即使切换任务没有发送给它的记录。
  • @Brian.D.Myers 我不需要,实际上,这是我现在的问题。 switch 任务没有向 ACCC014 任务发送任何记录,但它仍然由 Pentaho 执行。我不知道,直到切换任务,我是否需要执行 ACCC014。我在这里失去什么了吗?
  • 不,所有任务无论是否获取数据都会启动。是它创建不需要的文件的问题吗?您是否尝试设置“开始时不创建文件”选项?如果这些都不是问题,您能否发布由“ACCC014”运行的转换。

标签: pentaho kettle pdi pentaho-spoon pentaho-data-integration


【解决方案1】:

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

主要改造:

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

Transformation Executor 的可能调整:

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

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

子变换:

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

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

【讨论】:

  • 只是为了确认:Transformation Executor 没有并行执行,尽管没有收到上一步的行,映射也是如此?
  • 根据我的测试,如果没有输入行,它不会执行转换。
  • 你说得对,忘了标为正确!我们正在使用 Transformation Executor,一切正常!谢了!
  • 想知道您是否有任何替代方法 - 转换执行器可以工作,但运行速度非常慢。我认为在引擎盖下,每次调用都会重建/重新实例化所有内容。即使它不那么干净,我宁愿将所有内容都保持在同一个转换中而不牺牲性能,但我不知道如何在同一个转换中一次处理 X 行。
  • 您是否检查了“行分组”选项卡上的“发送到转换值的行数”?此外,子转换可能比转换执行器更快,但灵活性较差。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-09
  • 1970-01-01
相关资源
最近更新 更多