(+351) 21 24 10006  ·  info@bconcepts.pt
Carnaxide, Lisboa

Como validar data lineage em ELT: passo a passo

João Barros 09 de November de 2026 4 min de leitura

Validar data lineage em ELT significa provar de onde os dados vieram, que transformações sofreram e onde acabaram. Isto ajuda a investigar erros, cumprir auditorias e garantir confiança nas análises.

Pré-requisitos

  • Um ambiente ELT com suporte a SQL (ex.: Databricks, Azure Synapse, Snowflake).
  • Uma tabela de origem (raw) e uma tabela alvo (trusted/silver) no formato que preferir (Delta, Parquet, ou tabela SQL).
  • Permissão para criar tabelas/ficheiros de metadados e executar queries.
  • Noções básicas de SQL e de versionamento de código.

Passo 1: Definir os elementos de lineage que queremos capturar

Antes de codificar, escolha quais metadados serão registados: fonte (nome, esquema, timestamp), transformação (query ou job id), colunas impactadas e checksum ou hash da carga. Isto torna a validação prática e limitada ao essencial.

Passo 2: Criar uma tabela de metadados de lineage

Criar uma tabela simples para registar cada execução ELT. Inclui id, fonte, target, query_hash, row_count, col_checksums e run_timestamp. Exemplo em SQL que funciona em muitos motores:

CREATE TABLE IF NOT EXISTS lineage_metadata (
  run_id STRING PRIMARY KEY,
  source_name STRING,
  target_name STRING,
  query_hash STRING,
  row_count BIGINT,
  col_checksums STRING,
  run_timestamp TIMESTAMP
);

Passo 3: Gerar um identificador e hash da transformação

Antes de aplicar a transformação ELT, gere um run_id e um hash da query para identificar com precisão a lógica aplicada. O hash ajuda a detetar regressões quando a query muda.

-- Pseudocódigo SQL/psuedoscript
-- run_id: UUID ou timestamp + jobname
SET run_id = 'run_' || CURRENT_TIMESTAMP();
-- query_text: a SQL que fará a transformação
SET query_text = 'INSERT INTO trusted SELECT id, name, amount*1.0 FROM raw WHERE dt = ''2026-01-01''';
-- query_hash: usar função de hash do motor (MD5/SHA1/sha2)
SET query_hash = MD5(query_text);

Passo 4: Calcular checksums de colunas relevantes na origem

Calcule valores agregados que representem o conteúdo das colunas (por exemplo md5(concat(col1,col2))). Isto permite validar que os mesmos dados chegaram ao target após transformações previsíveis.

-- Exemplo: calcular checksum por coluna na origem
SELECT
  COUNT(*) AS row_count,
  MD5(CONCAT(COALESCE(id,''), COALESCE(name,''))) AS cols_checksum
FROM raw
WHERE dt = '2026-01-01';

Passo 5: Executar a transformação ELT e registar métricas

Execute a transformação (INSERT/CREATE TABLE AS SELECT) e imediatamente registe no lineage_metadata o run_id, fontes, target, query_hash, row_count e col_checksums calculados antes ou depois da carga.

-- 1) Transformação
INSERT INTO trusted
SELECT id, name, amount*1.0 AS amount
FROM raw
WHERE dt = '2026-01-01';

-- 2) Medir target
SELECT COUNT(*) AS row_count_target,
       MD5(CONCAT(COALESCE(id,''), COALESCE(name,''))) AS cols_checksum_target
FROM trusted
WHERE dt = '2026-01-01';

-- 3) Inserir metadados
INSERT INTO lineage_metadata (run_id, source_name, target_name, query_hash, row_count, col_checksums, run_timestamp)
VALUES (run_id, 'raw', 'trusted', query_hash, :row_count_target, :cols_checksum_target, CURRENT_TIMESTAMP());

Passo 6: Comparar checksums e row_count para validar lineage

Faça queries que comparem o checksum e row_count da origem com os registados no target. Se divergirem, investigue: transformação esperada (ex.: agregação) pode justificar diferenças; caso contrário, há problema.

-- Comparar origem vs target
WITH src AS (
  SELECT COUNT(*) AS rc, MD5(CONCAT(COALESCE(id,''), COALESCE(name,''))) AS cs
  FROM raw WHERE dt = '2026-01-01'
), tgt AS (
  SELECT COUNT(*) AS rc, MD5(CONCAT(COALESCE(id,''), COALESCE(name,''))) AS cs
  FROM trusted WHERE dt = '2026-01-01'
)
SELECT
  src.rc AS src_rows, tgt.rc AS tgt_rows,
  src.cs AS src_checksum, tgt.cs AS tgt_checksum
FROM src CROSS JOIN tgt;

Verificar o resultado

Confirme que row_count e col_checksums são iguais ou que as diferenças são explicadas pela lógica de transformação (ex.: agregação, filtro). Verifique também o lineage_metadata para cada run_id: deve conter query_hash e timestamp. Em caso de mismatch, corrija a query ou reprocese a carga.

Conclusão

Validar data lineage em ELT dá-lhe rastreabilidade e confiança para diagnósticos e auditorias. Próximos passos: automatizar o registo com scripts/Notebooks, integrar com CI/CD e armazenar query_text junto do query_hash. Dica: adicione um campo job_version para ligar o lineage ao código de transformação; já tem isso no seu processo?