IBM DataStage: Remove Duplicates and Sort Warning Message

La forma más rápida para detectar duplicados en SQL es utilizando la función de ordenación rank(). La descripción en la documentación oficial de SQL Server indica: Devuelve el rango de cada fila en la partición de un conjunto de resultados. El rango de una fila es uno más el número de rangos anteriores a la fila en cuestión. Lo que nos va a hacer es asignar un valor secuencial a un conjunto de datos agrupados por las columnas de la partición y con las de ordenación va a comprobar si ese conjunto es distinto (mantiene el mismo rango) o es diferente (suma 1 al rango). Veámoslo con un ejemplo, la sintaxis es igual en T-SQL que en Oracle:

SELECT * FROM (
    select rank() over (partition by FIELD1, FIELD2, FIELD3
    order by FIELD4 DESC  ) as RNK,
    FIELD1, FIELD2, FIELD3, FIELD4
    from STG.MyTable
) A

Vamos a generar una partición por tres columnas FIELD1, FIELD2 y FIELD3 ordenadas por la columna FIELD4. Si en nuestro set de datos tenemos dos tuplas con las cuatro columnas idénticas, la primera tendrá un RNK = 1 y la segunda RNK = 2. Si la columna FIELD4 fuera distinta en ambos casos, tendríamos un RNK=1 en sendas tuplas porque sería registros diferentes. Hemos ordenado la siguiente tabla para ver rápidamente los casos duplicados:

rowNumbermunicipiohabitantessuperficieKm2timestamp
1Alcorcón169.30833,72022-10-02 00:00:00
2Alcorcón169.30833,72022-11-15 00:00:00
3Fuenlabrada198.13239,22022-11-15 00:00:00
4Móstoles206.03146,12022-11-15 00:00:00
5Móstoles206.03145,42022-10-02 00:00:00
6Parla124.20824,52022-11-15 00:00:00
Datos INE 2012

Como puedes observar, las tuplas 1 y 2 son candidatas a duplicado (sólo cambia la fecha de inserción – columna timestamp). Las filas 4 y 5 no son duplicadas, puesto que la columna superficieKm2 es diferente. Si lanzamos nuestra consulta en SQL sobre las tres columnas de datos y ordenamos descendientemente por el timestamp para dar prioridad a la más reciente:

SELECT * FROM (
    select rank() over (partition by municipio, habitantes, superficieKm2
    order by timestamp DESC  ) as RNK,
     municipio, habitantes, superficieKm2, timestamp
    from STG.MyTable
) A

Observamos que la salida sería la siguiente (se añade la columna RNK por la izquierda):

rowNumberRNKmunicipiohabitantessuperficieKm2timestamp
11Alcorcón169.30833,72022-11-15 00:00:00
22Alcorcón169.30833,72022-10-02 00:00:00
31Fuenlabrada198.13239,22022-11-15 00:00:00
41Móstoles206.03146,12022-11-15 00:00:00
51Móstoles206.03145,42022-10-02 00:00:00
61Parla124.20824,52022-11-15 00:00:00
Datos INE 2012

Las dos primeras tuplas son el registro duplicado. La función RNK nos crea un rango en el que podemos ver que para la primera fila le asigna el valor 1 y para la segunda el 2. Al estar ordenados descendientemente por timestamp la fila con RNK = 1 es la más reciente. Para quedarnos sólo con un registro único por cada conjunto de datos simplemente añadimos una cláusula WHERE RNK = 1.

SELECT * FROM (
    select rank() over (partition by municipio, habitantes, superficieKm2
    order by timestamp DESC  ) as RNK,
     municipio, habitantes, superficieKm2, timestamp
    from STG.MyTable
) A
WHERE RNK = 1
rowNumberRNKmunicipiohabitantessuperficieKm2timestamp
11Alcorcón169.30833,72022-11-15 00:00:00
31Fuenlabrada198.13239,22022-11-15 00:00:00
41Móstoles206.03146,12022-11-15 00:00:00
51Móstoles206.03145,42022-10-02 00:00:00
61Parla124.20824,52022-11-15 00:00:00
Datos INE 2012

Eliminar duplicados en IBM Datastage

Para realizar la misma operación en IBM Datastage utilizaremos los stage de Sort y Remove duplicates. El primero para ordenar el dataset de origen de forma descendiente por la columna timestamp y el RDU para agrupar por el resto de columnas y eliminarlos del dataset de salida. Una puntualización, el stage Sort permite eliminar duplicados activándolo en la configuración y además nos permite capturar los rechazados para llevarlos a un dataset de rejects. Por contra, sólo podemos especificar que queremos un valor único, no cuál. Sin embargo con Remove duplicates sí podemos marcar si queremos el primer o último registro.

No siempre es necesario hacer una ordenación para eliminar duplicados. Si simplemente quieres quedarte con un registro sin importar cuál sea, se puede obviar la ordenación previa. Sin embargo, lo habitual es que sólo haya duplicados por ciertas columnas y desees preservar el dato más reciente. Para lograrlo debes ordenar el dataset por las columnas necesarias para poder identificar el registro que debe pasar.

Stages Sort y Remove Duplicates en IBM Datastage
Stages Sort y Remove Duplicates en IBM Datastage

User inserted sort does not fulfill the sort requirements warning 

Este error me saltó ayer mientras intentaba configurar el job para que ordenase por un campo de fecha DESC para quedarme con el registro más reciente. La agrupación se haría después por cuatro columnas en el Remove Duplicates.

User inserted sort does not fulfill the sort requirements warning 

StageName: When checking operator: User inserted sort «StageName» does not fulfill the sort requirements of the downstream operator «RDU_RI_COVER»

Solución

Es necesario comprobar que se cumplan los siguientes puntos:

  1. Los campos seleccionados en los stages Sort y Remove Duplicates deben ser del mismo tipo
  2. Deben mantener el orden en ambos stages. En el caso de que en el Sort necesitemos una o varias columnas adicionales para hacer la ordenación, se incluyen al final.
  3. Si estamos ejecutando un Parallel job y hemos configurado el particionamiento, debemos hacerlo por todos los campos que estemos usando para agrupar y detectar los duplicados. En el ejemplo, serían los Field1, Field2 y Field3. Si no lo hacemos así, corremos el riesgo de que los registros entren en distintas particiones y no se identifiquen como duplicados, por lo que llegarían a destino.
Datastage sort for remove duplicates
Sort Stage
IBM Datastage Remove Duplicates stage
Remove Duplicates stage

Además, en caso de que el particionado cambie respecto al stage previo, debemos configurar el stage Sort para que resetee el particionamiento en Input > Advanced > Preserve partitioning a CLEAR.

Preserve partitioning
Datastage Sort's Input partitioning
Sort’s Input partitioning
Datastage Remove duplicaates's Input partitioning
Remove Duplicates’ input partitioning

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

What is 4 + 2 ?
Please leave these two fields as-is: