Selo de estado:
Preview(teto atual do produto) · Curso ACD-220 — Pipelines e medalhão Bronze/Silver/Gold · Aula 10 de 12 · Atualizado em 2026-10-04.
Objetivo#
Ao final desta aula você vai diagnosticar drift e aplicar saneamento — ler a severidade de uma mudança de schema, saber o que o produto corrige sozinho e conduzir uma transição de tipo sem perder dado.
Vídeo#
Identificador no manifesto: acd-220-10-schema-drift-e-saneamento · duração-alvo 6 min · tela do produto: /sources.
Roteiro de gravação (4 capítulos):
| # | Minutagem-alvo | Capítulo | Tela do produto |
|---|---|---|---|
| 1 | 0:00–0:40 | Abertura: título + selo. O que é drift e por que a severidade importa mais que o aviso. | /sources |
| 2 | 0:40–2:30 | A tabela de severidades (info × atenção) e onde ela aparece: coluna nova, coluna removida, tipo mudado, tabela removida. | /sources |
| 3 | 2:30–4:10 | Saneamento automático da carga: nome de coluna com acento/espaço, envelope JSON, array/pretty-JSON — e a regra de não inventar dado. | /dags |
| 4 | 4:10–6:00 | Transição de tipo na Bronze: ver a incompatibilidade → conferir a prévia → acompanhar o resultado; encerramento com o "faça você mesmo". | /dags |
Conteúdo#
Aviso não é severidade
Coluna nova é info — aditivo, o mart não quebra. Coluna removida, tipo mudado e tabela removida são atenção — o mart que lê aquilo quebra. A severidade reportada é a pior encontrada, e o mart é marcado como "quebra" quando há qualquer atenção. É esse selo, não o volume de avisos, que decide se você precisa agir hoje.
O baseline: o que é schema e o que não é
A cada descoberta, o schema vira um baseline serializável com tabelas e colunas ordenadas por nome, guardando só {nome, tipo}. O que fica de fora de propósito: volume (número de linhas, tamanho). Volume não é schema — se entrasse, o baseline "mudaria" a cada estimativa e o drift viraria ruído.
A comparação é baseline × atual:
| Mudança | Severidade | Efeito |
|---|---|---|
| Coluna nova | info | Aditivo — o mart não quebra |
| Tabela nova | info | Aditivo |
| Coluna removida | atenção | O mart que a lê quebra |
| Tipo mudado | atenção | Conversão ou agregação a jusante quebra |
| Tabela removida | atenção | — |
Só as tabelas presentes nos dois lados têm as colunas comparadas; tabela que existe só de um lado vira "nova" (aditiva) ou "removida" (atenção).
Saneamento: o que o produto corrige sem perguntar
O saneamento é o fallback do load. A ingestão agendada puxa arquivos dos sistemas do cliente direto para a landing, e chaves com acento, espaço ou vazias ("preço", "nome do cliente") derrubariam o carregamento com "Invalid field name". Quando o carregamento NDJSON falha, o arquivo é saneado e recarregado:
| Problema no arquivo | O que o saneamento faz |
|---|---|
| Nome com acento, espaço ou maiúscula | Minúsculas, sem acento, com _ |
| Nome vazio | Vira coluna |
| Nome que começa com número | Ganha prefixo col_ |
Envelope {meta…, data:[…]} | É explodido: a lista de dentro passa a ser as linhas |
| JSON em array ou "bonitinho" (indentado) | É convertido para NDJSON (um objeto por linha) |
| Linha que não se consegue interpretar | É mantida como está — o produto não inventa dado |
Essa última regra é a mais importante: o saneamento é conservador. Ele renomeia e reformata; ele nunca adivinha conteúdo.
Transição de tipo na Bronze: três passos, nenhum deles escreve antes do seu
O caso mais incômodo de drift é o tipo mudar na origem: a coluna no destino é DATE e a origem passou a mandar texto, ou o inverso. Acrescentar linha não muda o tipo de uma coluna que já existe, e o BigQuery recusaria valor a valor — então a janela é parada, não forçada. A jornada tem três passos:
1. Ver a incompatibilidade. Só leitura: o campo, o tipo atual no destino, o tipo que a origem mandou e a janela parada (início → fim). As linhas daquela janela ficam guardadas numa tabela de recepção, com o valor original preservado, e o destino não foi tocado. Os exemplos de formato mostrados são sintéticos — nenhum valor de cliente aparece ali; eles servem para você ver as duas formas que convivem na mesma coluna, porque é a convivência que produz a incompatibilidade.
2. Conferir a prévia. Também só leitura, e é aqui que se decide: tipo atual × tipo proposto, preservação dos valores (os números que a contagem de linhas não dá), consumidores afetados — ou explicitamente "não verificados", quando não foi possível checar —, custo estimado e teto, escrita prevista e o recurso de recuperação. Abrir esta tela e preparar a prévia não alteram tipo, não disparam carga e não ativam agenda; está escrito na tela e é conferido no servidor.
3. Acompanhar o resultado. Auditoria, identidade da operação, ponto de retorno — e o limite desse ponto de retorno, dito sem promessa que não se sustenta: um ponto de retorno é um clone de um instante, e o produto não chama isso de "restauração integral".
Exemplo: a Comércio Aurora
O ERP da Aurora acrescenta canal_venda em vendas: drift info, aditivo — o mart segue funcionando e Maria decide com calma se vai usar a coluna nova. Na mesma semana, data_pedido passa a chegar como texto "03/01/2026" numa coluna que no destino é data: drift de tipo mudado, severidade atenção, mart marcado como "quebra". A janela das 14h fica parada na tabela de recepção com os valores originais; Maria abre a prévia, vê que a conversão proposta preserva todos os valores e que 2 consumidores (um mart Gold e um painel) são afetados, confere o custo estimado contra o teto e aplica. Um mês depois o CRM remove telefone de clientes: atenção, e a transformação Silver que lia a coluna precisa ser ajustada antes da próxima carga.
Erros comuns
| Sintoma | Causa provável | O que fazer |
|---|---|---|
| Coluna nova na origem não apareceu | Drift não propagado para a Bronze | Reexecute a descoberta/carga da fonte; na carga completa a tabela é recriada com o schema detectado |
| Tipo mudou e a Silver/Gold quebrou | Mudança de tipo incompatível | Ajuste a transformação ao novo tipo, ou conduza a transição de tipo |
| Carga falhou com "Invalid field name" | Nome de coluna com acento/espaço/vazio | O saneamento já tenta; confira o log para ver qual nome foi reescrito |
| A linha estranha continua estranha | Regra conservadora: não-parseável é mantida | Corrija na origem; o produto não inventa dado |
| Vi muitos avisos e entrei em pânico | Vários info não quebram nada | Olhe a severidade: só atenção marca o mart como "quebra" |
| Coluna aninhada não aparece no painel | Estruturas e listas não são publicadas nos marts | Publique colunas planas no Gold |
| A janela ficou parada e nada avançou | Incompatibilidade de tipo detectada | É o comportamento desejado: conduza os três passos da transição |
O que é Preview aqui
O baseline, a comparação de schema e o saneamento são determinísticos e provados por teste (C04.2 = GA-candidato). A aplicação da transição no BigQuery, os consumidores afetados e o custo real dependem de nuvem — Preview. Quando o produto não consegue verificar os consumidores, ele diz "não verificados" em vez de afirmar que está tudo bem. Nada aqui é "GA".
Faça você mesmo#
No workspace de treino Aurora Varejo, em vendas, só com dados sintéticos.
- Rode uma carga de
vendase guarde o schema atual como referência (anote colunas e tipos). - Provoque um drift aditivo: acrescente na origem sintética uma coluna
canal_vendae rode de novo. Confirme que a severidade éinfoe que o mart não foi marcado como "quebra". - Provoque um drift de atenção: remova (na origem sintética) uma coluna que a sua transformação Silver usa e rode. Confirme a severidade
atençãoe identifique qual mart é marcado como "quebra". - Ajuste a transformação Silver para o novo schema e rode novamente até a severidade voltar ao normal.
- Exercite o saneamento: importe um CSV cujo cabeçalho tenha
preçoenome do cliente. Depois da carga, veja no Console de dados com que nomes as colunas chegaram à Bronze. - Importe um JSON em formato de envelope (
{meta: …, data: [ … ]}) e confirme que as linhas de dentro viraram as linhas da tabela. - Se houver uma incompatibilidade de tipo disponível no ambiente de treino, abra a jornada de transição e pare no passo 2: leia a prévia inteira (preservação de valores, consumidores, custo e teto) sem aplicar.
Você terminou quando você produziu um drift info e um drift atenção e sabe qual deles exige ação hoje, viu os nomes de coluna reescritos pelo saneamento na Bronze, e leu uma prévia de transição de tipo sem ter alterado nada.
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/pipeline-medalhao
- suporte/troubleshooting-pipeline-schema
- data/conceitos-qualidade-e-quarentena
Capacidades ensinadas#
C04.2 — o selo exibido na aula é sempre o estado mais conservador entre as capacidades citadas; nada aqui é "GA".