Proposta de site feita pela Genesis Innovation · conteúdo do LinkedIn de Daniel Santos

Pular para o conteúdo
Daniel Santos

Wiki Qualidade, CI/CD e custo

Qualidade de dados

Regras escritas como consulta, que rodam a cada carga e barram ou separam o que viola. Qualidade que depende de alguém olhar não é qualidade.

As dimensões clássicas de qualidade viram perguntas que uma consulta responde:

  • Completude: o campo obrigatório veio? (valor IS NULL)
  • Unicidade: a chave se repete? (COUNT(*) > 1 por chave)
  • Validade: o valor está no domínio? (status conhecido, valor positivo, data válida)
  • Integridade referencial: a chave estrangeira existe? (pedido de cliente que não existe)
  • Atualidade: o dado mais novo é de quando?

Um relatório de regras, que roda aqui

Cada regra conta quantas linhas a violam. Zero é verde.

SQL · SQLite
SELECT 'valor preenchido' AS regra, COUNT(*) AS violacoes FROM pedidos WHERE valor IS NULL
UNION ALL
SELECT 'valor positivo', COUNT(*) FROM pedidos WHERE valor <= 0
UNION ALL
SELECT 'status conhecido', COUNT(*) FROM pedidos WHERE status NOT IN ('entregue', 'cancelado', 'pendente')
UNION ALL
SELECT 'cliente existe', COUNT(*) FROM pedidos p WHERE NOT EXISTS (SELECT 1 FROM clientes c WHERE c.id = p.cliente_id)
UNION ALL
SELECT 'evento sem repetição', COUNT(*) - COUNT(DISTINCT id_evento) FROM eventos;

Saída

regra                | violacoes
-------------------- | ---------
valor preenchido     | 1
valor positivo       | 0
status conhecido     | 0
cliente existe       | 1
evento sem repetição | 1

O que fazer com quem viola

A regra precisa dizer a consequência, e há três:

  • Avisar e deixar passar (registrar a métrica);
  • Descartar a linha (ou mandar para uma tabela de quarentena, para não perder);
  • Parar a carga inteira, quando a violação significa que algo maior quebrou.

Nos pipelines declarativos do Databricks, as três existem como *expectations*:

PySparkPrecisa de um cluster Spark: não roda aqui.
import dlt

@dlt.table
@dlt.expect("valor_preenchido", "valor IS NOT NULL")
@dlt.expect_or_drop("valor_positivo", "valor > 0")
@dlt.expect_or_fail("status_conhecido", "status IN ('entregue', 'cancelado', 'pendente')")
def pedidos_silver():
    return spark.readStream.table("bronze.pedidos")

Em tabelas Delta comuns, ALTER TABLE … ADD CONSTRAINT … CHECK (valor > 0) faz a escrita que viola a regra falhar.

  • Meça a taxa de violação ao longo do tempo: uma regra que sempre teve 0,1% e hoje tem 30% é um incidente, mesmo que 30% "passe".
  • Regra de qualidade é código: versionada, revisada e testada como o resto (veja CI/CD para dados).

Fontes

Conhecimento compartilhado pela Genesis Innovation.