Selo de estado:
Preview(teto atual do produto) · Curso ACD-220 — Pipelines e medalhão Bronze/Silver/Gold · Aula 7 de 12 · Atualizado em 2026-10-04.
Objetivo#
Ao final desta aula você vai criar validação e ler rejeitados — decidir o que corrigir e o que descartar na passagem Bronze → Silver, e medir a perda em número, não em sensação.
Vídeo#
Identificador no manifesto: acd-220-07-silver-qualidade-dedup · duração-alvo 8 min · tela do produto: /sources.
Roteiro de gravação (5 capítulos):
| # | Minutagem-alvo | Capítulo | Tela do produto |
|---|---|---|---|
| 1 | 0:00–0:45 | Abertura: título + selo. A regra de ouro: corrigir quando é seguro, descartar quando não é. | /sources |
| 2 | 0:45–3:00 | Etapa Transformações → tabela Silver: filtro, conversão de tipo e coluna calculada, com prévia do SQL ao vivo. | /sources |
| 3 | 3:00–5:00 | Deduplicação: chave de duplicidade, coluna de ordenação e direção — qual registro fica. | /sources |
| 4 | 5:00–6:40 | A conta rejeitadas = Bronze − Silver no registro de execução, e como investigar um pico olhando a Bronze. | /dags |
| 5 | 6:40–8:00 | Honestidade: não existe fila de quarentena por linha; DLQ é para execuções. Encerramento com o "faça você mesmo". | /dados |
Conteúdo#
A diferença é sempre visível
Toda execução grava o trio Bronze / Silver / rejeitadas, e a conta é explícita: rejeitadas = linhas na Bronze − linhas na Silver. Nada desaparece em silêncio. E o cru rejeitado continua na Bronze — a Silver não é um triturador, é um filtro.
Corrigir ou descartar: os sete tipos de regra
A validação de qualidade é o conjunto de regras aplicadas linha a linha na passagem Bronze → Silver. Cada tipo tem um efeito previsível:
| Tipo de regra | Exemplo | Efeito na linha |
|---|---|---|
| Obrigatório | pedido_id vazio | descarta |
| Domínio | status = cancelado | descarta |
| Tipo/formato | data AAAA-MM-DD; quantidade inteira > 0 | inválido → descarta |
| Normalização | UF para 2 letras maiúsculas | ajusta; se não der, descarta |
| Preenchimento | categoria vazia → "Sem categoria" | corrige e mantém a linha |
| Derivação | receita = preço × quantidade | cria coluna calculada |
| Deduplicação | por pedido_id | mantém uma ocorrência, descarta as outras |
A regra de ouro
Corrija quando é seguro (preenchimento, normalização) e descarte quando não é (obrigatório, domínio, tipo). Toda linha descartada entra na conta de rejeitadas — então uma regra dura mal calibrada aparece como um salto no contador, não como um número errado no painel.
Um detalhe que salva horas em dado brasileiro: o parse de preço aceita os dois formatos — 1.299,90 (BR) e 199.90 (US). Antes de culpar a regra, confira se o problema não é outro: separador decimal costuma estar certo.
Como isso se monta na tela
Na etapa Transformações, cada tabela Silver é montada num builder visual com tabela base, cruzamentos, colunas (com conversão de tipo e formato), coluna calculada e filtro — e prévia do SQL ao vivo. Há dois modos: Guiado (didático, campo a campo) e Avançado (SQL livre), e a lógica em código que o editor visual não representa não é apagada por você passar pela etapa.
As regras duras viram filtro (valor > 0, status <> 'cancelado'); as normalizações e derivações viram colunas com conversão e expressão calculada. A aula 8 detalha os passos pt-BR que compõem essas regras.
Deduplicação: três escolhas, não uma
Ligar a deduplicação exige responder três coisas, e cada uma muda o resultado:
- Chave de duplicidade — quais colunas definem "a mesma linha" (a chave de negócio real, não o
idtécnico que a origem renumera). - Coluna de ordenação — qual campo decide a disputa (
atualizado_em,_ingestao_em). - Direção — crescente ou decrescente, isto é: mantém o primeiro ou o último.
Na implementação de referência, a dedupe de vendas é por pedido_id mantendo a primeira ocorrência. Isso torna a Silver idempotente por chave mesmo que a origem mande a mesma linha duas vezes. Nas transformações declaradas por você, a escolha de manter: primeiro | último com uma coluna de desempate é explícita — e é ela que define se você fica com o cadastro antigo ou com a correção mais recente.
"Quarentena": o que existe de verdade
Aqui vale honestidade, porque o nome circula no mercado: não existe hoje uma tabela de quarentena separada para linhas reprovadas na Silver, com fluxo de correção e reenvio por linha. O que existe cumpre o mesmo papel em três peças:
- Bronze verbatim guarda todas as linhas cruas — a retenção do que chegou;
- o contador de rejeitadas torna a perda mensurável a cada execução;
- o saneamento automático da carga preserva a linha problemática em vez de inventar dado (linha não-parseável é mantida como está).
Você não perde o dado rejeitado e sabe quanto rejeitou — mas não espere uma fila de correção por linha. E não confunda com a DLQ: ela é para execuções (jobs) que falham, não para linhas de dado.
Exemplo: a Comércio Aurora
Maria recebe sete linhas no Bronze de vendas:
pedido_id;data_pedido;uf;categoria;preco_unitario;quantidade;status
P-1001;2026-01-03;SP;Bebidas;12,90;3;pago
P-1001;2026-01-03;SP;Bebidas;12,90;3;pago # duplicata → descarta a 2ª
P-1002;2026/01/03;RJ;Limpeza;29,90;1;pago # data inválida → descarta
P-1003;2026-01-04;Minas;Bebidas;12,90;2;pago # UF inválida → descarta
P-1004;2026-01-04;MG;;0;1;pago # preço 0 → descarta
P-1005;2026-01-05;MG;;12,90;2;cancelado # cancelado → descarta
P-1006;2026-01-05;SP;;12,90;2;pago # categoria vazia → "Sem categoria" (mantém)Resultado: 7 na Bronze, 2 na Silver (P-1001 na primeira ocorrência e P-1006 com categoria preenchida e receita = 25,80), 5 rejeitadas. Maria vê exatamente isso no registro de execução — e quando o contador salta de 5 para 400 na semana seguinte, ela sabe que algo mudou na origem antes de qualquer painel mostrar número errado.
Erros comuns
| Sintoma | Causa provável | O que fazer |
|---|---|---|
| Rejeição altíssima de um dia para o outro | Formato de data ou preço mudou na origem | Compare Bronze × Silver entre execuções; olhe o cru na Bronze |
| Duplicatas chegando no Gold | Chave de dedupe errada (técnica, não de negócio) | Reveja qual coluna é a chave de negócio real |
| Dedupe ficou com o registro velho | Direção/coluna de ordenação invertidas | Troque para manter o último por atualizado_em |
| "Onde vejo as linhas rejeitadas?" | Não há fila de quarentena por linha | Investigue o cru na Bronze; o contador diz quantas |
| Perdi linha que eu queria corrigir | Regra dura onde cabia preenchimento | Troque descarte por normalização/preenchimento quando é seguro |
| Confundi rejeitadas com DLQ | DLQ é de execução, não de linha | Ver tratar falha e DLQ |
O que é Preview aqui
As regras de qualidade, a deduplicação e o contador de rejeitadas são determinísticos e congelados por testes de referência. A materialização real em BigQuery é Preview — e sem fila de quarentena por linha a investigação é sempre pela Bronze. Nada aqui é "GA".
Faça você mesmo#
No workspace de treino Aurora Varejo, em vendas, com as sete linhas sintéticas do exemplo acima.
- Carregue as sete linhas na Bronze (importe o CSV com delimitador
;) e confirme no Console de dados que a Bronze tem 7 linhas. - Em
/sources, na etapa Transformações, crie a tabela Silver devendasa partir da Bronze. - Acrescente o filtro
valor > 0(oupreco_unitario > 0, conforme o nome da sua coluna) e leia a prévia do SQL para ver onde ele entrou. - Acrescente a regra de domínio que descarta
status = canceladoe a derivaçãoreceita = preco_unitario × quantidade. - Ligue a deduplicação: chave
pedido_id, coluna de ordenação_ingestao_em, mantendo a primeira ocorrência. - Publique, rode a trilha completa e abra o registro da execução: anote Bronze, Silver e rejeitadas.
- Confirme a conta
rejeitadas = Bronze − Silvere identifique, olhando o cru na Bronze, qual regra reprovou cada linha descartada. - Mude a direção da dedupe para manter o último e rode de novo: observe se o contador muda e explique por quê.
Você terminou quando a Silver tem só as linhas válidas e sem duplicata, o contador de rejeitadas fecha a conta com a Bronze, e você consegue apontar a regra responsável por cada linha que ficou de fora.
Checagem rápida#
Três perguntas no final da aula, corrigidas no servidor. A aula só conta como concluída depois da checagem.
Documentação relacionada#
- data/tutoriais/criar-validacao-qualidade
- data/conceitos-qualidade-e-quarentena
- data/tutoriais/tratar-falha-dlq
Capacidades ensinadas#
(conceitual — sem capacidade específica da matriz) — o selo exibido na aula é sempre o estado mais conservador entre as capacidades citadas; nada aqui é "GA".