Primer lugar quisiera decir que ser capaz de tomar de 17 millones de registros desde un archivo plano, empujando a una base de datos en un servidor remoto y tener que tomar de 7 minutos es increíble. SSIS es realmente fantástico. Pero ahora que tengo los datos hasta allí, ¿cómo puedo eliminar duplicados?

Mejor aún, quiero tomar el archivo plano, quitar los duplicados de los archivos planos y ponerlas de nuevo en otro archivo plano.

Estoy pensando en un:

Data Flow Task

  • Archivo de origen (con un archivo asociado conexión)
  • Un contenedor de bucles for
  • Un contenedor de script que contiene un poco de lógica para saber si la otra fila existe

Gracias usted, y a todos en este sitio es muy conocedores.

Update: He encontrado este enlace, puede ayudar a responder esta pregunta

Cuando usted dice «duplicados», ¿te refieres a los registros que son idénticos, o registros donde las claves principales son idénticos?

OriginalEl autor RyanKeeter | 2008-09-29

9 Comentarios

  1. 21

    Utilizar el Tipo de Componente.

    Simplemente seleccione los campos que desea ordenar su carga filas y en la esquina inferior izquierda verás una casilla de verificación para eliminar los duplicados. Este cuadro elimina todas las filas que son duplicados basándose en los criterios de clasificación sólo
    así, en el ejemplo a continuación, las filas se consideran duplicados si sólo nos ordena en el primer campo:

    1 | sample A |
    1 | sample B |
    +1 esta es la respuesta correcta…

    OriginalEl autor Craig Warren

  2. 5

    Sugeriría con SSIS una copia de los registros a una tabla temporal, a continuación, crear una tarea que se utiliza Select Distinct o Clasificar dependiendo de su situación para seleccionar los duplicados que se destinará a un archivo plano y eliminarlos de la tabla temporal. El último paso sería una copia de los registros de la tabla temporal en la tabla de destino.

    La determinación de un duplicado es algo SQL es buena, pero un archivo plano no es tan bien. En el caso propuesto, la secuencia de comandos de contenedor de carga de una fila y, a continuación, habría que compararlo contra 17 millones de registros, a continuación, cargar la fila siguiente y repetir…El rendimiento podría no ser tan grande.

    Y es más rápido.

    OriginalEl autor Timothy Lee Russell

  3. 3

    Origen de Archivo sin formato –> Agregado (Grupo de Columnas que desea único) –> Planos de Destino del Archivo de

    OriginalEl autor

  4. 1

    La estrategia general dependerá de cuántas columnas de la tabla provisional. Las columnas más, cuanto más compleja sea la solución. El artículo enlazado tiene algunos muy buenos consejos.

    Lo único que voy a añadir a lo que todos los demás se ha dicho hasta ahora, es que las columnas, con la fecha y los valores datetime le dará algunas de las soluciones que aquí se presenta se ajusta.

    Una solución que encontré es este:

    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

    Esto es MUCHO más rápido cuando se hace deduping, de un CURSOR y no a la vinculación del CPU del servidor. Para ello, separe cada columna que viene desde el archivo de texto en sus propias variables. Utilizar una instrucción SELECT antes y dentro del bucle, a continuación, incluir en la instrucción INSERT. Esto ha funcionado muy bien para mí.

    Héctor, usted va a ser mi salvador cuando se trata de este SSIS esfuerzo! Muchas gracias!
    Uno se alegra de estar de servicio. 😉

    OriginalEl autor Hector Sosa Jr

  5. 1

    Para ello en el archivo plano, puedo usar la herramienta de línea de comandos de unix, tipo:

    sort -u inputfile > outputfile

    Por desgracia, el windows comando ordenar que no tienen una única opción, pero podría intentar la descarga de una especie de la utilidad de uno de estos:

    (No he probado, así que no hay garantías, me temo).

    Por otro lado, para hacer esto, ya que los registros se cargan en la base de datos, puede crear un índice único en la clave de la tabla de base de datos con ignore_dup_key. Esto hará que los registros únicos de manera muy eficiente en tiempo de carga.

    CREATE UNIQUE INDEX idx1 ON TABLE (col1, col2, ...) WITH IGNORE_DUP_KEY

    OriginalEl autor AJ.

  6. 1

    Un poco sucio solución es establecer el objetivo de la tabla con una clave compuesta, que abarca todas las columnas. Esto garantiza que distinguirán singularidad. A continuación, en los Datos de Destino de la forma, configurar la tarea para ignorar los errores. Todos los duplicados inserta caerá en el olvido.

    OriginalEl autor Christian Loris

  7. 1

    Podemos utilizar look up tables para esto. Como SSIS proporciona dos DFS (Flujo de Datos de las Transformaciones), es decir, Agrupación Aproximada y Búsqueda Aproximada.

    OriginalEl autor Mohit

  8. 0

    Encontrado esta página enlace de texto podría ser vale la pena mirar, aunque con 17 millones de registros puede ser un poco demasiado largo

    OriginalEl autor BobF

  9. 0

    Yo recomendaría la carga de una tabla de ensayo en el servidor de destino y, a continuación, combinar los resultados en una tabla de destino en el servidor de destino. Si usted necesita para ejecutar cualquiera de las normas de higiene, entonces usted puede hacer esto a través de procedimiento almacenado, ya que están obligados a obtener un mejor rendimiento que a través de SSIS flujo de datos tareas de transformación. Además, deduping generalmente es un proceso de múltiples pasos. Puede que desee de la deduplicación en:

    1. Líneas distintas.
    2. Distintos grupos de columnas como Nombre, apellido, Dirección de Correo electrónico, etc.
    3. Puede que desee de la deduplicación en contra de una ya existente de la tabla de destino. Si ese es el caso, entonces puede que tenga que incluir NO EXISTE o NO EN las declaraciones. O puede que desee actualizar la fila original con los nuevos valores. Esto por lo general es mejor servido con una COMBINACIÓN de instrucción y una subconsulta para la fuente.
    4. Tomar la primera o última fila de un patrón en particular. Por ejemplo, puede que desee de la última fila especificada en el archivo para cada ocurrencia de una dirección de correo electrónico o número de teléfono. Yo normalmente dependen de CTE con ROW_NUMBER() para generar un orden secuencial y en orden inverso columnas como en el folling ejemplo:

    .

    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;

    Hay un montón de opciones para usted en deduping archivos, pero en definitiva recomiendo esta gestión en un procedimiento almacenado una vez que haya cargado una puesta en escena de la tabla en el servidor de destino. Después de limpiar los datos, entonces usted puede COMBINAR o INSERTAR en su destino final.

    OriginalEl autor Registered User

Dejar respuesta

Please enter your comment!
Please enter your name here