【发布时间】:2020-05-20 23:51:09
【问题描述】:
如果源表中不存在记录,我正在尝试从目标表中删除记录。我使用 PDI 作为 ETL 工具。源中有大约 1000 万条记录。如果 key 每天都在整个表中查找匹配项,然后如果找不到则删除它,这不是很耗时。如何以最有效的方式实现这一点。
由于我是这个工具的新手,请您详细解释一下
【问题讨论】:
标签: pentaho target pdi not-exists delete-record
如果源表中不存在记录,我正在尝试从目标表中删除记录。我使用 PDI 作为 ETL 工具。源中有大约 1000 万条记录。如果 key 每天都在整个表中查找匹配项,然后如果找不到则删除它,这不是很耗时。如何以最有效的方式实现这一点。
由于我是这个工具的新手,请您详细解释一下
【问题讨论】:
标签: pentaho target pdi not-exists delete-record
是的,大量数据需要很长时间。但是,您可以利用数据库可以进行的优化来优化流程。
执行此操作的典型方法是使用两个表输入步骤和一个合并 (diff) 步骤创建一个转换。该步骤需要两个输入流,匹配键,然后比较您指定的任何其他字段,在输出流中添加一个带有“new”、“deleted”、“changed”或“identical”的标志。对于您的情况,您只关心“已删除”。
如果要检查记录是否存在,只需要主键/唯一键,不需要其他字段。这将允许源数据库使用索引,甚至不接触表本身。从目标表中获取记录也是如此,但显然您稍后会在那里进行更改。
表输入应选择主/唯一键列并按它们排序。如果源数据库不同并且您有一个非数字键,您可能需要对 Pentaho 中的行进行排序,但我会假设某种整数或 bigint。
将两个流连接到合并 (diff) 步骤。目标表是引用(旧状态),源表是比较(新状态)。使用获取字段按钮获取关键字段并比较字段。它应该只是你的关键列。
添加过滤行步骤并按 flagfield = "deleted" 过滤。添加两个虚拟步骤并将它们连接为真和假。现在运行转换并验证变为“true”的行确实存在于目标中,但不再存在于源中。
在您对此进行测试并确认它提供了正确的行之后,您可能需要使用“删除”步骤来删除目标表记录。如果您直接在同一个转换中执行此操作,这可能会导致死锁,因为您既要从目标表中读取又要从目标表中删除。因此,您可以添加一个“将行复制到结果”步骤,将行传递给父作业。
在父作业中,您进行第二次转换。那只需要两个步骤:从结果中获取行和删除。
【讨论】: