6

まず、フラットファイルから1700万レコードを取得し、リモートボックスのDBにプッシュして、7分かかるのは素晴らしいことです。SSISは本当に素晴らしいです。しかし、そのデータがそこにあるので、重複を削除するにはどうすればよいですか?

さらに良いことに、フラットファイルを取得し、フラットファイルから重複を削除して、別のフラットファイルに戻したいと思います。

私は考えています:

Data Flow Task

  • ファイルソース(関連するファイル接続を含む)
  • forループコンテナ
  • 別の行が存在するかどうかを判断するロジックを含むスクリプトコンテナ

よろしくお願いします。このサイトの誰もが信じられないほど知識が豊富です。

Update: 私はこのリンクを見つけました、この質問に答えるのに役立つかもしれません

4

9 に答える 9

23

ソート コンポーネントを使用します。

ロードされた行を並べ替えるフィールドを選択するだけで、左下隅に重複を削除するためのチェック ボックスが表示されます。このボックスは、並べ替え基準のみに基づいて重複している行を削除します。そのため、以下の例では、最初のフィールドのみで並べ替えた場合、行は重複していると見なされます。

1 | sample A |
1 | sample B |
于 2009-03-06T14:02:36.827 に答える
6

SSIS を使用してレコードを一時テーブルにコピーし、状況に応じて Select Distinct または Rank を使用して重複を選択するタスクを作成し、それらをフラット ファイルに集めて一時テーブルから削除することをお勧めします。最後の手順は、一時テーブルから宛先テーブルにレコードをコピーすることです。

重複の判別は SQL が得意とするところですが、フラット ファイルはあまり適していません。あなたが提案した場合、スクリプト コンテナは行をロードし、それを 1,700 万のレコードと比較し、次の行をロードして繰り返す必要があります...パフォーマンスはそれほど優れていない可能性があります。

于 2008-09-29T21:48:15.927 に答える
5

フラット ファイル ソース --> 集計 (一意にする列ごとにグループ化) --> フラット ファイルの宛先

于 2009-06-10T22:05:06.107 に答える
2

少し汚い解決策は、すべての列にまたがる複合キーを使用してターゲットテーブルを設定することです。これにより、明確な一意性が保証されます。次に、[データの宛先]図形で、エラーを無視するようにタスクを構成します。重複する挿入物はすべて忘却に陥ります。

于 2008-12-07T05:27:38.607 に答える
2

戦略は通常、ステージング テーブルの列数によって異なります。列が多いほど、ソリューションは複雑になります。あなたがリンクした記事には、いくつかの非常に良いアドバイスがあります。

これまでに他の人が言ったことに追加する唯一のことは、日付と日時の値を含む列が、ここで提示された解決策のいくつかに適合するということです。

私が思いついた1つの解決策はこれです:

SET NOCOUNT ON

DECLARE @email varchar(100)

SET @email = ''

SET @emailid = (SELECT min(email) from StagingTable WITH (NOLOCK) WHERE email > @email)

WHILE @emailid IS NOT NULL
BEGIN

    -- Do INSERT statement based on the email
    INSERT StagingTable2 (Email)
    FROM StagingTable WITH (NOLOCK) 
    WHERE email = @email

    SET @emailid = (SELECT min(email) from StagingTable WITH (NOLOCK) WHERE email > @email)

END

これは、CURSOR よりも重複排除を行う場合にはるかに高速であり、サーバーの CPU を固定しません。これを使用するには、テキスト ファイルの各列を独自の変数に分けます。ループの前と内側で別々の SELECT ステートメントを使用してから、それらを INSERT ステートメントに含めます。これは私にとって本当にうまくいきました。

于 2008-09-29T22:10:09.353 に答える
2

フラット ファイルでこれを行うには、UNIX コマンド ライン ツールの sort を使用します。

sort -u inputfile > outputfile

残念ながら、Windows の sort コマンドには固有のオプションがありませんが、次のいずれかからソート ユーティリティをダウンロードしてみてください。

(私はそれらを試していないので、保証はできませんが、恐れています)。

一方、レコードがデータベースにロードされるときにこれを行うには、ignore_dup_key を使用してデータベース テーブルのキーに一意のインデックスを作成できます。これにより、ロード時にレコードが非常に効率的に一意になります。

CREATE UNIQUE INDEX idx1 ON TABLE (col1, col2, ...) WITH IGNORE_DUP_KEY
于 2008-09-30T12:32:25.490 に答える
2

これにはルックアップ テーブルを使用できます。SSIS と同様に、Fuzzy Grouping と Fuzzy Lookup の 2 つの DFS (データ フロー変換) が提供されます。

于 2011-10-11T09:42:15.510 に答える
1

このページのリンク テキストは一見の価値があるかもしれませんが、1,700 万件のレコードでは少し時間がかかりすぎる可能性があります。

于 2010-07-29T12:46:06.157 に答える
1

宛先サーバーにステージング テーブルをロードし、その結果を宛先サーバーのターゲット テーブルにマージすることをお勧めします。衛生規則を実行する必要がある場合は、SSIS データ フロー変換タスクよりも優れたパフォーマンスを得ることができるため、ストアド プロシージャを使用して実行できます。さらに、重複排除は通常、複数のステップからなるプロセスです。次のものを重複排除することができます。

  1. 明確な線。
  2. 名、姓、電子メール アドレスなどの個別の列のグループ。
  3. 既存のターゲット テーブルに対して重複除外することが必要な場合があります。その場合は、NOT EXISTS または NOT IN ステートメントを含める必要があるかもしれません。または、元の行を新しい値で更新したい場合があります。これは通常、ソースの MERGE ステートメントとサブクエリを使用するのが最適です。
  4. 特定のパターンの最初または最後の行を取ります。たとえば、電子メール アドレスまたは電話番号が出現するたびに、ファイルに入力された最後の行が必要な場合があります。私は通常、ROW_NUMBER() を使用した CTE に依存して、次のサンプルのように順次および逆順の列を生成します。

.

WITH    
    sample_records 
    (       email_address
        ,   entry_date
        ,   row_identifier
    )
    AS
    (
            SELECT      'tester@test.com'
                    ,   '2009-10-08 10:00:00'
                    ,   1
        UNION ALL

            SELECT      'tester@test.com'
                    ,   '2009-10-08 10:00:01'
                    ,   2

        UNION ALL

            SELECT      'tester@test.com'
                    ,   '2009-10-08 10:00:02'
                    ,   3

        UNION ALL

            SELECT      'the_other_test@test.com'
                    ,   '2009-10-08 10:00:00'
                    ,   4

        UNION ALL

            SELECT      'the_other_test@test.com'
                    ,   '2009-10-08 10:00:00'
                    ,   5
    )
,   filter_records 
    (       email_address
        ,   entry_date
        ,   row_identifier
        ,   sequential_order
        ,   reverse_order
    )
    AS
    (
        SELECT  email_address
            ,   entry_date
            ,   row_identifier
            ,   'sequential_order'  = ROW_NUMBER() OVER (
                                        PARTITION BY    email_address 
                                        ORDER BY        row_identifier ASC)
            ,   'reverse_order'     = ROW_NUMBER() OVER (
                                        PARTITION BY    email_address
                                        ORDER BY        row_identifier DESC)
        FROM    sample_records
    )
    SELECT      email_address
            ,   entry_date
            ,   row_identifier
    FROM        filter_records
    WHERE       reverse_order = 1
    ORDER BY    email_address;

ファイルの重複排除には多くのオプションがありますが、最終的には、宛先サーバーにステージング テーブルをロードしたら、ストアド プロシージャでこれを処理することをお勧めします。データをクレンジングした後、最終的な宛先に MERGE または INSERT を実行できます。

于 2009-10-08T17:23:32.423 に答える