5

Permítame decir primero que es capaz de tomar 17 millones de registros de un archivo plano, empujar a un DB en una caja remota y hacer que tarden 7 minutos es increíble. SSIS es realmente fantástico. Pero ahora que tengo esos datos allí, ¿cómo elimino los duplicados?¿Cómo eliminar filas duplicadas del archivo plano utilizando SSIS?

Mejor aún, quiero tomar el archivo plano, eliminar los duplicados del archivo plano y volver a ponerlos en otro archivo plano.

Me refiero a:

Data Flow Task

  • fuente de archivo (con una conexión de archivo asociado)
  • Un contenedor de bucles
  • Un contenedor de script que contiene cierta lógica indicar si existe otra fila

Thak usted, y todos en este sitio son increíblemente bien informados.

Update:I have found this link, might help in answering this question

+0

Cuando dices "duplicados", ¿te refieres a registros que son idénticos, o registros donde las claves principales son idénticas? –

Respuesta

5

se recomienda usar SSIS para copiar los registros a una tabla temporal, a continuación, crear una tarea que utiliza SELECT DISTINCT o rango dependiendo de su situación para seleccionar los duplicados que les embudo para una archivo plano y eliminarlos de la tabla temporal. El último paso sería copiar los registros de la tabla temporal en la tabla de destino.

La determinación de un duplicado es algo en lo que SQL es bueno, pero un archivo plano no es tan adecuado. En el caso que usted propuso, el contenedor de script cargaría una fila y luego tendría que compararla con 17 millones de registros, luego cargaría la siguiente fila y repetiría ... El rendimiento podría no ser tan bueno.

+0

Y es más rápido. – thotwielder

1

La estrategia generalmente dependerá de cuántas columnas tenga la tabla de etapas. Cuantas más columnas, más compleja es la solución. El artículo que vinculó tiene algunos consejos muy buenos.

Lo único que añadiré a lo que todos los demás han dicho hasta ahora es que las columnas con valores de fecha y fecha y hora darán cabida algunas de las soluciones presentadas aquí.

Una solución que se me ocurrió es la siguiente:

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 paridad de la CPU del servidor. Para usar esto, separe cada columna que proviene del archivo de texto en sus propias variables. Use una instrucción SELECT por separado antes y dentro del ciclo, luego inclúyalos en la instrucción INSERT. Esto funcionó muy bien para mí.

+0

Héctor, vas a ser mi salvador cuando se trata de este esfuerzo de SSIS. Muchas gracias! – RyanKeeter

+0

Uno está contento de estar de servicio. ;) –

1

Para hacer esto en el archivo plano, use la herramienta de línea de comandos de Unix, para ordenar:

sort -u inputfile > outputfile 

Por desgracia, el comando ventanas tipo no tiene una opción única, pero se puede intentar descargar una utilidad especie desde uno de estos:

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

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

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

Una solución un tanto sucia es establecer su tabla de destino con una clave compuesta que abarque todas las columnas. Esto garantizará la singularidad distint. Luego, en la forma de Destino de datos, configure la tarea para ignorar los errores. Todos los insertos duplicados caerán en el olvido.

20

Utilice el componente Ordenar.

Simplemente elija en qué campos desea ordenar las filas cargadas y en la esquina inferior izquierda verá una casilla de verificación para eliminar duplicados. Esta casilla permite eliminar todas las filas que están duplicados en base a los criterios de ordenación sólo se por lo que en el ejemplo a continuación las filas sería considerado duplicado si sólo se solucionó en el primer campo:

1 | sample A | 
1 | sample B | 
+0

+1 esta es la respuesta correcta ... –

3

origen de archivo plano -> Agregada (Agrupar por columnas que desee único) -> Destino de archivo plano

0

Recomendaría cargar una tabla de etapas en el servidor de destino y luego combinar los resultados en una tabla de destino en el servidor de destino. Si necesita ejecutar alguna regla de higiene, puede hacerlo a través de un procedimiento almacenado, ya que obtendrá un mejor rendimiento que a través de las tareas de transformación de flujo de datos de SSIS. Además, la deduping es generalmente un proceso de varios pasos. Es posible que desee deducer en:

  1. Distintas líneas.
  2. Distintos grupos de columnas como Nombre, Apellido, Dirección de correo electrónico, etc.
  3. Es posible que desee deducir en una tabla de destino existente. Si ese es el caso, entonces es posible que deba incluir declaraciones NOT EXISTS o NOT IN. O quizás desee actualizar la fila original con nuevos valores. Por lo general, esto se realiza mejor con una instrucción MERGE y una subconsulta para la fuente.
  4. Tome la primera o la última fila de un patrón en particular. Por ejemplo, puede querer que la última fila ingresada en el archivo aparezca cada vez que aparezca una dirección de correo electrónico o un número de teléfono. Normalmente me baso en CTE con ROW_NUMBER() para generar columnas de orden secuencial y orden inverso como en la muestra siguiente:

.

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 los archivos deduping, pero en última instancia Recomiendo el manejo de este en un procedimiento almacenado, una vez que haya cargado una tabla de etapas en el servidor de destino. Después de limpiar los datos, puede fusionar o INSERTAR en su destino final.

0

encontrado esta página link text podría ser digno de mirar, aunque con 17 millones de discos puede tardar un poco demasiado largo

1

Podemos utilizar tablas de consulta para esto. Al igual que SSIS proporciona dos DFS (Transformaciones de flujo de datos), es decir, agrupamiento difuso y búsqueda difusa.

Cuestiones relacionadas