【问题标题】:How to implement deduplication in a billion rows table ssis如何在十亿行表ssis中实现重复数据删除
【发布时间】:2013-08-16 12:36:23
【问题描述】:

在 ssis 中实现不同操作的最佳选择是什么? 我有一个超过 200 列的表,包含超过 1000 万行。 我需要从此表中获取不同的行。使用执行 sql 任务(使用选择查询来删除行的重复数据)是明智的,还是有其他方法可以在 ssis 中实现这一点

我确实理解 ssis 排序组件会删除行的重复数据。但这是一个阻塞组件,使用它根本不是一个好主意...请让我知道您对此的看法

【问题讨论】:

  • 为什么排序组件没有用?据我所知,这是唯一可以让您区分两面性的转换。或者你可以使用类似 SQL 的命令。
  • 您是在尝试检索不同的行还是从原始表中删除重复的行?
  • sort 组件在执行重复数据删除之前进行排序。所以我的问题是使用排序还是使用 sql。哪个更好
  • 尝试删除重复项
  • 我的数学有点模糊,1000万行怎么变成10亿行

标签: sql sql-server sql-server-2008 ssis etl


【解决方案1】:

我是这样分3步完成的:

  1. 将 MillionRow 表转储到 HashDump 表中,该表只有 2 列:Id int identity PK 和 Hash varbinary(20)。该表应在其 Hash 列上建立索引。
  2. 将 HashDump 表转储到按 Hash 列排序的 HashUni 中。中间是一个脚本组件,它检查当前行的哈希列值是否与前一行相同。如果相同,则将行直接复制到重复输出,否则为唯一。这样,即使您需要的只是唯一的,您也可以记录重复。
  3. 将 MillionRow 表转储到 MillionUni 表中。中间是一个查找组件,它使用 HashUni 来判断哪一行是唯一的。

此方法允许我记录每个重复项,并显示一条消息,例如:“第 1000 行是第 100 行的重复项”。

我还没有找到比这更好的方法。之前我在MillionUni上做了一个唯一索引,直接把MillionRow转储进去,但是我不能使用“快速加载”,太慢了。

这是填充哈希列的一种方法:

public override void Input0_ProcessInputRow(Input0Buffer Row)
{
    StringBuilder sb = new StringBuilder();
    sb.Append(Row.Col1String_IsNull ? "" : Row.Col1String); sb.Append("|");
    sb.Append(Row.Col2Num_IsNull ? "" : Row.Col2Num.ToString()); sb.Append("|");
    sb.Append(Row.Col3Date_IsNull ? "" : Row.Col3Date.ToString("yyyy-MM-dd"));
    var sha1Provider = HashAlgorithm.Create("SHA1"); 
    Row.Hash = sha1Provider.ComputeHash(Encoding.UTF8.GetBytes(sb.ToString()));
}

如果证明 200 列对您来说是一件苦差事,那么 this article 的一部分将激发您的灵感。它正在将所有列对象的值循环成一个字符串。

要比较哈希,请使用this method

byte[] previousHash;
int previousRowNo;

public override void Input0_ProcessInputRow(Input0Buffer Row)
{
    if (StructuralComparisons.StructuralEqualityComparer.Equals(Row.Hash, previousHash))
    {
        Row.DupRowNo = previousRowNo;
        Row.DirectRowToDuplicate();
    }
    else
    {
        Row.DirectRowToUnique();
    }
    previousHash = Row.Hash;
    previousRowNo = Row.RowNo;
}

【讨论】:

    【解决方案2】:

    我不会为它打扰 SSIS,几个查询就可以了;你还有很多数据,所以我建议你在运行查询之前检查执行计划,并优化你的索引

    http://www.brijrajsingh.com/2011/03/delete-duplicate-record-but-keep.html

    查看我写的关于同一主题的小文章

    【讨论】:

      【解决方案3】:

      据我所知,排序组件是唯一可以让您区分两面性的转换。或者您可以使用类似 SQL 的命令。
      如果排序操作有问题,那么您应该在数据访问模式规范中使用(假设您的源是 DB)“SQL 命令”。选择不同的数据,就是这样。您还可以节省一点时间,因为 ETL 不必通过排序组件。

      【讨论】:

        猜你喜欢
        • 2012-08-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-01-02
        • 2014-06-19
        • 1970-01-01
        • 1970-01-01
        • 2019-01-08
        相关资源
        最近更新 更多