如何使用Pentaho DI从输出表中删除重复行?

如何使用Pentaho DI从输出表中删除重复行?,pentaho,kettle,pentaho-design-studio,Pentaho,Kettle,Pentaho Design Studio,我正在创建一个转换,从CSV文件中获取输入并输出到表中。这是正确运行的,但问题是如果我多次运行该转换。然后,输出表一次又一次地包含重复的行 现在我想从输出表中删除所有重复的行 如果我反复运行转换,它不会影响输出表,直到它没有新行 如何解决这个问题?我想到了两个解决方案: 使用Insert/Update步骤而不是Table input步骤将数据存储到输出表中。它将根据您定义的关键字段(案例中的所有字段/列),尝试搜索输出表中与传入记录流行匹配的行。它的工作原理如下: 如果找不到该行,它将插入该行

我正在创建一个转换,从CSV文件中获取输入并输出到表中。这是正确运行的,但问题是如果我多次运行该转换。然后,输出表一次又一次地包含重复的行

现在我想从输出表中删除所有重复的行

如果我反复运行转换,它不会影响输出表,直到它没有新行


如何解决这个问题?

我想到了两个解决方案:

  • 使用
    Insert/Update
    步骤而不是
    Table input
    步骤将数据存储到输出表中。它将根据您定义的关键字段(案例中的所有字段/列),尝试搜索输出表中与传入记录流行匹配的行。它的工作原理如下:

    • 如果找不到该行,它将插入该行。如果可以找到,并且要更新的字段相同,则不会执行任何操作。如果它们不完全相同,则更新表中的行
    使用以下参数:

    • 查找值的键:
      tableField1=streamField1;tableField2=streamField2;tableField3=streamField3等等
    • 更新字段:
      tableField1,streamField1,N;表2,streamField2,N;表3,河流3,N等等
  • 将双面打印值存储到输出表后,可以使用以下概念删除双面打印:

    • 使用
      executesql步骤
      ,在该步骤中定义删除重复项并仅保留唯一行的SQL。您可以在此处激发灵感,创建这样一个SQL:

  • 另一种方法是使用
    合并行(diff)
    步骤,然后是
    合并后同步
    步骤

    只要CSV中与目标表不同的行数低于总数的20-25%,这通常是最有利于性能的选项

    Merge rows(diff)
    获取两个必须按其关键字段排序的输入流(通过兼容的排序规则),并生成两个输入的并集,每一行标记为“new”、“changed”、“deleted”或“idential”。这意味着如果不能使用ORDER BY子句,您必须在CSV输入上放置
    排序行
    步骤,可能还有来自目标表的输入。将CSV输入标记为“比较”行原点,将目标表标记为“参考”

    然后,“合并后同步”步骤将行中标记的更改应用于目标表。请注意,
    合并后同步
    是PDI中唯一需要在“高级”选项卡中输入输入的步骤(我相信)。您可以在这里设置标志字段和标识行操作的值。应用更改后,目标表将包含与输入CSV完全相同的数据


    还请注意,如果需要,可以使用
    开关/Case
    筛选行
    步骤来执行删除或更新等操作。我经常从“相同”的行中流出,将其余的写入文本文件,以便只检查更改。

    我寻找直观的答案,但答案是文本,所以为像我这样的新手添加这个直观的答案

    案例

    user-updateslog.csv(具有dup值)--->users\u表,仅存储最新的用户详细信息

    解决方案

    步骤1:将csv连接到插入/更新,如下面的转换所示

    步骤2:在Insert/Update中,添加条件以比较键以找到候选行,并选择“Y”字段进行更新


    您使用什么步骤将数据存储到表中?是否是
    表输出
    步骤?@mzy是表输出。是否有一些键标识每一行?或者如何识别duplicite行?该数据中没有键。我们只能比较每一列,这意味着您需要比较表中的所有列,以找出是否存在重复行?好啊我将发布一些解决方案。它是否也会影响我的数据库表?您是否讨论第二个建议的解决方案对