Estado: Preview. As regras de qualidade e deduplicação são provadas por teste determinístico e congeladas pelo conjunto de testes de referência; a materialização real no datalake = NÃO MEDIDO. Dados de exemplo sintéticos.
Leia antes:
conceitos-fluxo-de-dados.md. Referência da camada Silver empipeline-medalhao.md.
O princípio: o cru nunca se perde#
A qualidade do Ingestia é aplicada na passagem Bronze → Silver. A garantia central é que o Bronze é imutável e verbatim: cada linha da origem entra como texto, sem conversão, com carimbos de auditoria. Portanto, nenhuma linha some — mesmo uma linha reprovada na limpeza continua existindo no Bronze, disponível para inspeção e reprocessamento.
Bronze (tudo, cru) → regras de qualidade + dedupe → Silver (só o válido, limpo)
│
└──▶ rejeitadas = Bronze − Silver (contadas, visíveis)As regras de qualidade (exemplo de referência)#
A implementação de referência (tabela sintética vendas) aplica as regras linha a
linha. Uma reprovação = a linha não entra na Silver e é contada em rejectedRows:
| Regra | Comportamento |
|---|---|
Status cancelado | descartado |
| Quantidade | inteiro > 0, senão descarta |
| Preço | aceita BR (1.299,90) e US (199.90); > 0, senão descarta |
| Data | YYYY-MM-DD válida, senão descarta; deriva mes = YYYY-MM |
| UF | normaliza para 2 letras maiúsculas, senão descarta |
pedido_id | obrigatório |
| Categoria vazia | vira "Sem categoria" (não descarta) |
| Deduplicação | por pedido_id, mantém a 1ª ocorrência |
receita | derivada = preço × quantidade |
Note a diferença entre descartar (a linha reprovou uma regra dura) e corrigir (categoria vazia vira "Sem categoria" — a linha é mantida). O produto corrige quando é seguro e descarta quando não é.
Rejeitados: a diferença é sempre visível#
O número de linhas rejeitadas é sempre explícito:
rejectedRows = bronzeRows − silverRowsCada execução grava esse trio (Bronze / Silver / rejeitadas) no histórico de execuções. Você vê, a cada run, quantas linhas entraram cruas, quantas sobreviveram à limpeza e quantas ficaram de fora. Nada é descartado em silêncio.
Deduplicação#
A deduplicação acontece na Silver, por chave de negócio (no exemplo, pedido_id),
mantendo a primeira ocorrência. Duplicatas subsequentes da mesma chave são
descartadas (e entram na conta de rejeitadas). Isso torna a Silver idempotente por
chave, mesmo que a origem envie a mesma linha mais de uma vez.
"Quarentena": o que o produto realmente faz (honestidade)#
Não existe hoje uma tabela de quarentena separada para linhas reprovadas na camada Silver. O que existe — e cumpre o mesmo papel — é a combinação:
- Bronze verbatim guarda todas as linhas cruas (a "retenção" do que chegou);
- o contador de rejeitadas (
bronzeRows − silverRows) torna a perda mensurável; - o saneamento automático de carga preserva linhas problemáticas de arquivo em vez de inventar dado (linha não-parseável é mantida como está).
Em outras palavras: você não perde o dado rejeitado (ele está no Bronze) e sabe
quanto rejeitou (contador), mas o Ingestia não promete hoje uma fila de
quarentena dedicada com fluxo de correção/reenvio por linha. Não confunda isto com a
DLQ, que é para execuções (jobs) que falham — não para linhas de dado. Veja
tratar-falha-dlq.md.
Schema drift: o mart não quebra em silêncio#
Quando o schema da fonte muda, o Ingestia compara o baseline salvo com o schema atual:
| Mudança | Severidade | Efeito |
|---|---|---|
| coluna/tabela nova | info | aditivo — o mart não quebra |
| coluna removida | atencao | o mart que a lê quebra |
| tipo mudado | atencao | cast/agregação a jusante quebra |
| tabela removida | atencao | — |
A severidade reportada é a pior encontrada; o mart é marcado como "quebra" quando há
atencao. Isso te avisa antes de um dashboard mostrar número errado.
Profiling seguro (amostra que não vaza)#
Ao catalogar uma tabela, o profiling calcula por coluna: tipo declarado × inferido, % de nulos, distintos (estimativa), min/max, comprimento e até 5 exemplos. A segurança é embutida:
- Coluna PII → exemplos viram
•••; min/max/distintos/comprimento suprimidos. - Coluna oculta por governança → nem aparece (o nome não viaja).
- Tetos: 50 colunas, exemplo 60 chars, payload ≤ 32 KiB.
Quando usar / quando não usar estas garantias#
- Confie nelas para: medir a saúde de uma fonte (taxa de rejeição), evitar duplicatas por chave, e ser avisado de mudanças de schema.
- Não conte com: uma fila de quarentena por linha com reenvio automático (não
existe hoje), nem com deleção física propagada por watermark puro (veja
conceitos-modos-de-carga.md).
Relacionados#
- Pipeline medalhão Bronze/Silver/Gold
- Tutorial: criar uma validação de qualidade
- Tutorial: construir Bronze/Silver/Gold
- Tutorial: tratar falha e DLQ
Última revisão: 2026-09-08.