Pular para o conteúdo principal

RemoveDuplicatesTransformer

Visão geral​

Converte estágios RemoveDuplicates do DataStage em SQL usando DISTINCT ou ROW_NUMBER(). Remove linhas duplicadas com base nas colunas-chave especificadas ou em todas as colunas.

Tipo de estágio: REMOVE_DUPLICATES (operador remdup) Saída: SQL com DISTINCT ou ROW_NUMBER()

Recursos​

  • Remoção de duplicatas exatas (todas as colunas coincidem) usando DISTINCT
  • Remoção de duplicatas por colunas-chave usando ROW_NUMBER() com PARTITION BY
  • Manutenção da primeira ou da última ocorrência de duplicatas
  • Preservação do esquema de entrada (nenhuma coluna adicionada/removida)
  • Filtragem de colunas pela cláusula keep

Exemplo de estágio DataStage​

Exemplo 1: remover duplicatas por colunas-chave (manter a última)​

Entrada (formato .dsx)​

#### STAGE: RemoveDuplicate
## Operator
remdup
## Operator options
-keep last
-key 'TYPE_CODE'
-key 'SOURCE_INFO'

## General options
[ident('RemoveDuplicate'); jobmon_ident('RemoveDuplicate')]
## Inputs
0< [] 'InputData:input.v'
## Outputs
0> [modify (
keep
MONTH_REF,DESC_FIELD_1,DESC_FIELD_2,TYPE_CODE,
SOURCE_INFO,INFO_DETAIL,LOAD_DATE,SOURCE_SYSTEM,
JOB_NAME;
)] 'RemoveDuplicate:output.v'

Esquema de entrada​

[
{"name": "MONTH_REF", "type": "string"},
{"name": "DESC_FIELD_1", "type": "string"},
{"name": "DESC_FIELD_2", "type": "string"},
{"name": "TYPE_CODE", "type": "string"},
{"name": "SOURCE_INFO", "type": "string"},
{"name": "INFO_DETAIL", "type": "string"},
{"name": "LOAD_DATE", "type": "date"},
{"name": "SOURCE_SYSTEM", "type": "string"},
{"name": "JOB_NAME", "type": "string"}
]

SQL gerado​

SELECT
MONTH_REF,
DESC_FIELD_1,
DESC_FIELD_2,
TYPE_CODE,
SOURCE_INFO,
INFO_DETAIL,
LOAD_DATE,
SOURCE_SYSTEM,
JOB_NAME
FROM (
SELECT
*,
ROW_NUMBER() OVER (
PARTITION BY TYPE_CODE, SOURCE_INFO
ORDER BY TYPE_CODE DESC, SOURCE_INFO DESC
) AS _row_num
FROM inputdata_V8S0
) AS ranked
WHERE _row_num = 1

Esquema de saída​

[
{"name": "MONTH_REF", "type": "string"},
{"name": "DESC_FIELD_1", "type": "string"},
{"name": "DESC_FIELD_2", "type": "string"},
{"name": "TYPE_CODE", "type": "string"},
{"name": "SOURCE_INFO", "type": "string"},
{"name": "INFO_DETAIL", "type": "string"},
{"name": "LOAD_DATE", "type": "date"},
{"name": "SOURCE_SYSTEM", "type": "string"},
{"name": "JOB_NAME", "type": "string"}
]

Exemplo 2: remover duplicatas (manter a primeira)​

Entrada (formato .dsx)​

#### STAGE: DeduplicateData
## Operator
remdup
## Operator options
-keep first
-key 'CUSTOMER_ID'
-key 'PRODUCT_ID'

## General options
[ident('DeduplicateData'); jobmon_ident('DeduplicateData')]
## Inputs
0< [] 'SourceData:input.v'
## Outputs
0> [] 'DeduplicateData:Output.v'

SQL gerado​

SELECT
CUSTOMER_ID,
PRODUCT_ID,
ORDER_DATE,
AMOUNT
FROM (
SELECT
*,
ROW_NUMBER() OVER (
PARTITION BY CUSTOMER_ID, PRODUCT_ID
ORDER BY CUSTOMER_ID, PRODUCT_ID
) AS _row_num
FROM sourcedata_V0S5
) AS ranked
WHERE _row_num = 1

Exemplo 3: remover duplicatas exatas (todas as colunas)​

Entrada (formato .dsx)​

#### STAGE: RemoveExactDupes
## Operator
remdup
## General options
[ident('RemoveExactDupes'); jobmon_ident('RemoveExactDupes')]
## Inputs
0< [] 'RawData:input.v'
## Outputs
0> [] 'RemoveExactDupes:Output.v'

SQL gerado​

SELECT DISTINCT
CUSTOMER_ID,
PRODUCT_ID,
ORDER_DATE,
AMOUNT
FROM rawdata_V0S12

Como funciona​

1. Identificar a estratégia de deduplicação​

Sem colunas-chave (duplicatas exatas)​

## Operator
remdup
# No -key options specified

Usa SELECT DISTINCT para remover linhas em que todas as colunas coincidem exatamente.

Com colunas-chave​

-key 'TYPE_CODE'
-key 'SOURCE_INFO'

Usa ROW_NUMBER() OVER (PARTITION BY ...) para remover linhas em que as colunas-chave coincidem.

2. Determinar a opção keep​

  • -keep first (padrão): Mantém a primeira ocorrência e remove duplicatas posteriores

    • Ordena pelas colunas-chave em ASC (ordem de classificação padrão)
    ORDER BY TYPE_CODE, SOURCE_INFO
  • -keep last: Mantém a última ocorrência e remove duplicatas anteriores

    • Ordena pelas colunas-chave em DESC
    ORDER BY TYPE_CODE DESC, SOURCE_INFO DESC

3. Aplicar a cláusula keep​

Filtra as colunas de saída com base na lista keep da seção modify:

keep
MONTH_REF,DESC_FIELD_1,TYPE_CODE,
SOURCE_INFO,LOAD_DATE;

Apenas essas colunas aparecem no SELECT final.

4. Gerar SQL​

Para duplicatas exatas (sem chaves)​

SELECT DISTINCT
<all_columns or keep_columns>
FROM input_table

Para deduplicação por chave (manter a primeira)​

SELECT
<keep_columns or all_columns>
FROM (
SELECT
*,
ROW_NUMBER() OVER (
PARTITION BY <key_columns>
ORDER BY <key_columns>
) AS _row_num
FROM input_table
) AS ranked
WHERE _row_num = 1

Para deduplicação por chave (manter a última)​

SELECT
<keep_columns or all_columns>
FROM (
SELECT
*,
ROW_NUMBER() OVER (
PARTITION BY <key_columns>
ORDER BY <key_columns> DESC
) AS _row_num
FROM input_table
) AS ranked
WHERE _row_num = 1

5. Preservar o esquema​

O esquema de saída corresponde às colunas da cláusula keep (ou a todas as colunas de entrada, se não houver cláusula keep).

Estratégias de deduplicação​

Remoção de duplicatas exatas​

Use quando quiser remover linhas completamente idênticas em todas as colunas.

Caso de uso:

Input:
ID NAME VALUE
1 Alice 100
1 Alice 100 ← Duplicate (all columns match)
2 Bob 200

Output:
ID NAME VALUE
1 Alice 100
2 Bob 200

Deduplicação por chave (manter a primeira)​

Use quando quiser manter a primeira ocorrência de linhas com colunas-chave coincidentes.

Caso de uso:

Input:
TYPE SOURCE VALUE
A SYS1 100 ← Keep (first occurrence)
A SYS1 150 ← Remove
B SYS2 200

Output:
TYPE SOURCE VALUE
A SYS1 100
B SYS2 200

Deduplicação por chave (manter a última)​

Use quando quiser manter a última ocorrência de linhas com colunas-chave coincidentes.

Caso de uso:

Input:
TYPE SOURCE VALUE
A SYS1 100 ← Remove
A SYS1 150 ← Keep (last occurrence)
B SYS2 200

Output:
TYPE SOURCE VALUE
A SYS1 150
B SYS2 200

Chaves compostas​

Você pode deduplicar usando múltiplas colunas-chave:

Entrada​

-key 'REGION_CODE'
-key 'CUSTOMER_ID'
-key 'PRODUCT_ID'
-keep first

SQL gerado​

SELECT
REGION_CODE,
CUSTOMER_ID,
PRODUCT_ID,
ORDER_DATE,
AMOUNT
FROM (
SELECT
*,
ROW_NUMBER() OVER (
PARTITION BY REGION_CODE, CUSTOMER_ID, PRODUCT_ID
ORDER BY REGION_CODE, CUSTOMER_ID, PRODUCT_ID
) AS _row_num
FROM input_table
) AS ranked
WHERE _row_num = 1

Apenas linhas com as três chaves coincidentes são consideradas duplicatas.

Cláusula keep​

A cláusula keep na seção modify filtra quais colunas aparecem na saída:

Sem cláusula keep​

## Outputs
0> [] 'RemoveDuplicate:output.v'

Todas as colunas de entrada são incluídas na saída.

Com cláusula keep​

## Outputs
0> [modify (
keep
MONTH_REF,TYPE_CODE,SOURCE_INFO,
LOAD_DATE,JOB_NAME;
)] 'RemoveDuplicate:output.v'

Apenas as colunas especificadas aparecem no SELECT de saída.

Limitações​

  • ⚠️ Manter a última sem ordem natural - Quando -keep last é usado sem uma coluna de timestamp, o resultado pode depender da ordem física das linhas. Considere adicionar um ORDER BY explícito por timestamp, se disponível.
  • ⚠️ Múltiplas entradas não suportadas - O estágio RemoveDuplicates deve ter exatamente uma entrada
  • ⚠️ Sem ORDER BY personalizado - Ao usar colunas-chave, a ordenação é sempre pelas próprias colunas-chave. Para uma lógica de registro mais recente baseada em timestamp, considere usar AGGREGATOR com MAX(timestamp) ou adicionar manualmente um timestamp à cláusula ORDER BY.
  • ⚠️ ORDER BY usa apenas colunas-chave - A cláusula ORDER BY usa as mesmas colunas de PARTITION BY. Se precisar manter a linha com o timestamp mais recente, talvez seja necessário modificar o SQL gerado ou usar outra abordagem.
  • AggregatorStageTransformer - Para agrupamento com agregações (COUNT, SUM etc.)
  • FunnelStageTransformer - Para combinar múltiplas entradas e remover duplicatas
  • ModifyStageTransformer - Para filtragem de colunas após a deduplicação