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.
Transformadores relacionados
- 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