Как удалить повторяющиеся строки из плоского файла с помощью SSIS?

Позвольте мне сначала сказать, что возможность взять 17 миллионов записей из плоского файла, отправить их в БД на удаленном компьютере и потратить 7 минут - это потрясающе. SSIS действительно фантастический. Но теперь, когда у меня есть эти данные, как мне удалить дубликаты?

Еще лучше, я хочу взять плоский файл, удалить дубликаты из плоского файла и вернуть их в другой плоский файл.

Я думаю о:

Data Flow Task

  • Источник файла (со связанным файловым подключением)
  • Контейнер цикла for
  • Контейнер сценария, который содержит некоторую логику, чтобы определить, существует ли другая строка.

Спасибо, и все на этом сайте невероятно осведомлены.

Update: I нашли эту ссылку, может помочь в ответе на этот вопрос


person RyanKeeter    schedule 29.09.2008    source источник
comment
Когда вы говорите «дубликаты», вы имеете в виду идентичные записи или записи с идентичными первичными ключами?   -  person AJ.    schedule 30.09.2008


Ответы (9)


Используйте компонент сортировки.

Просто выберите поля, по которым вы хотите отсортировать загруженные строки, и в нижнем левом углу вы увидите флажок для удаления дубликатов. Это поле удаляет все повторяющиеся строки только на основании критериев сортировки, поэтому в приведенном ниже примере строки будут считаться повторяющимися, если мы отсортируем только по первому полю:

1 | sample A |
1 | sample B |
person Craig Warren    schedule 06.03.2009

Я бы предложил использовать SSIS для копирования записей во временную таблицу, а затем создать задачу, которая использует Select Distinct или Rank в зависимости от вашей ситуации, чтобы выбрать дубликаты, которые будут перенаправлять их в плоский файл и удалять их из временной таблицы. Последним шагом будет копирование записей из временной таблицы в целевую таблицу.

Определение дубликата - это то, в чем SQL хорош, но плоский файл не так хорошо подходит. В случае, который вы предложили, контейнер сценария загрузит строку, а затем должен будет сравнить ее с 17 миллионами записей, затем загрузить следующую строку и повторить ... Производительность может быть не такой уж большой.

person Timothy Lee Russell    schedule 29.09.2008

Источник плоского файла -> Агрегировать (группировать по столбцам, которые вы хотите уникальны) -> Назначение плоского файла

person Community    schedule 10.06.2009

Стратегия обычно зависит от количества столбцов в промежуточной таблице. Чем больше столбцов, тем сложнее решение. В статье, на которую вы ссылаетесь, есть очень хороший совет.

Единственное, что я добавлю к тому, что до сих пор говорили все, это то, что столбцы со значениями date и datetime дадут некоторые из представленных здесь решений.

Одно из решений, которое я придумал, таково:

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, и не будет привязать процессор сервера. Чтобы использовать это, разделите каждый столбец, полученный из текстового файла, на их собственные переменные. Используйте отдельный оператор SELECT до и внутри цикла, а затем включите их в оператор INSERT. Это очень хорошо сработало для меня.

person Hector Sosa Jr    schedule 29.09.2008
comment
Гектор, ты будешь моим спасителем, когда дело касается SSIS! Большое спасибо! - person RyanKeeter; 30.09.2008
comment
Один рад быть полезным. ;) - person Hector Sosa Jr; 30.09.2008

Чтобы сделать это в плоском файле, я использую инструмент командной строки unix, sort:

sort -u inputfile > outputfile

К сожалению, команда сортировки Windows не имеет уникальной опции, но вы можете попробовать загрузить утилиту сортировки из одного из них:

(Не пробовал, боюсь, никаких гарантий).

С другой стороны, чтобы сделать это по мере загрузки записей в базу данных, вы можете создать уникальный индекс по ключу таблицы базы данных с ignore_dup_key. Это очень эффективно сделает записи уникальными во время загрузки.

CREATE UNIQUE INDEX idx1 ON TABLE (col1, col2, ...) WITH IGNORE_DUP_KEY
person AJ.    schedule 30.09.2008

Для этого мы можем использовать таблицы поиска. Как и SSIS, предоставляет две DFS (преобразования потока данных), то есть нечеткое группирование и нечеткий поиск.

person Mohit    schedule 11.10.2011

Немного грязное решение - настроить вашу целевую таблицу с составным ключом, охватывающим все столбцы. Это гарантирует неповторимую уникальность. Затем в форме «Место назначения данных» настройте задачу так, чтобы она игнорировала ошибки. Все дублирующие вставки уйдут в небытие.

person Christian Loris    schedule 07.12.2008

Нашел эту страницу текст ссылки, возможно, стоит посмотреть, хотя с 17 миллионами записей может потребоваться слишком много времени

person SQLBobScot    schedule 29.07.2010

Я бы рекомендовал загрузить промежуточную таблицу на целевом сервере, а затем объединить результаты в целевую таблицу на целевом сервере. Если вам нужно выполнить какие-либо правила гигиены, вы можете сделать это с помощью хранимой процедуры, поскольку вы обязательно получите лучшую производительность, чем с помощью задач преобразования потока данных SSIS. Кроме того, дедупликация - это, как правило, многоэтапный процесс. Вы можете сделать дедупликацию на:

  1. Четкие линии.
  2. Четкие группы столбцов, такие как имя, фамилия, адрес электронной почты и т. Д.
  3. Вы можете выполнить дедупликацию из существующей целевой таблицы. В этом случае вам может потребоваться включить операторы NOT EXISTS или NOT IN. Или вы можете обновить исходную строку новыми значениями. Обычно это лучше всего выполняется с помощью оператора MERGE и подзапроса для источника.
  4. Возьмите первый или последний ряд определенного узора. Например, вам может потребоваться вводить последнюю строку в файл для каждого вхождения адреса электронной почты или номера телефона. Я обычно полагаюсь на CTE с ROW_NUMBER () для создания столбцов с последовательным и обратным порядком, как в следующем примере:

.

WITH    
    sample_records 
    (       email_address
        ,   entry_date
        ,   row_identifier
    )
    AS
    (
            SELECT      '[email protected]'
                    ,   '2009-10-08 10:00:00'
                    ,   1
        UNION ALL

            SELECT      '[email protected]'
                    ,   '2009-10-08 10:00:01'
                    ,   2

        UNION ALL

            SELECT      '[email protected]'
                    ,   '2009-10-08 10:00:02'
                    ,   3

        UNION ALL

            SELECT      '[email protected]'
                    ,   '2009-10-08 10:00:00'
                    ,   4

        UNION ALL

            SELECT      '[email protected]'
                    ,   '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;

У вас есть много вариантов дедупликации файлов, но в конечном итоге я рекомендую обрабатывать это в хранимой процедуре, как только вы загрузили промежуточную таблицу на целевой сервер. После очистки данных вы можете либо ОБЪЕДИНЯТЬ, либо ВСТАВИТЬ в конечный пункт назначения.

person Registered User    schedule 08.10.2009