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

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

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

Я думаю о a:

Data Flow Task

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

Thak Вы, и все на этом сайте невероятно хорошо осведомлены.

Update: Я нашел эту ссылку, мог бы помочь в ответе на этот вопрос

6
задан John Saunders 6 September 2012 в 18:12
поделиться

7 ответов

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

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

1 | sample A |
1 | sample B |
23
ответ дан 8 December 2019 в 02:14
поделиться

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

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

6
ответ дан 8 December 2019 в 02:14
поделиться

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

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

Одно решение, которое я предложил, является этим:

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

Это НАМНОГО быстрее при выполнении дедупликации, чем КУРСОР и не привяжет ЦП сервера. Для использования этого разделите каждый столбец, который прибывает из текстового файла в их собственные переменные. Используйте отдельный оператор SELECT прежде и в цикле, затем включайте их в оператор INSERT. Это работало действительно хорошо на меня.

2
ответ дан 8 December 2019 в 02:14
поделиться

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

sort -u inputfile > outputfile

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

(Я не судил их, таким образом, никакие гарантии, я боюсь).

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

CREATE UNIQUE INDEX idx1 ON TABLE (col1, col2, ...) WITH IGNORE_DUP_KEY
2
ответ дан 8 December 2019 в 02:14
поделиться

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

2
ответ дан 8 December 2019 в 02:14
поделиться

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

4
ответ дан 8 December 2019 в 02:14
поделиться

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

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

.

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;

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

.

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;

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

.

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;

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

1
ответ дан 8 December 2019 в 02:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: