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

Pular para o conteúdo
Daniel Santos

Wiki Delta Lake

MERGE (upsert)

Atualizar o que já existe e inserir o que é novo numa operação só, atômica. É o coração da carga incremental na camada silver.

Carga incremental: chegou um lote com pedidos novos e pedidos que mudaram de status. Apagar e reinserir tudo é caro; inserir só o novo deixa o status velho. O MERGE casa cada linha do lote com a tabela pela chave e decide o que fazer.

Databricks SQLDatabricks SQL / Delta: roda num workspace, não aqui.
MERGE INTO silver.pedidos AS alvo
USING lote_do_dia AS origem
ON alvo.id = origem.id
WHEN MATCHED AND origem.atualizado_em > alvo.atualizado_em THEN
  UPDATE SET *
WHEN NOT MATCHED THEN
  INSERT *
WHEN NOT MATCHED BY SOURCE AND alvo.data >= current_date() - INTERVAL 7 DAYS THEN
  DELETE;
  • WHEN MATCHED: a chave existe dos dois lados (aqui, só atualiza se o dado for mais novo).
  • WHEN NOT MATCHED: só existe no lote, então entra.
  • WHEN NOT MATCHED BY SOURCE: só existe na tabela (sumiu da origem). Use com um filtro, senão apaga a tabela inteira que não veio no lote.

A regra que mais derruba MERGE

Se duas linhas do lote casam com a mesma linha da tabela, o Delta falha (a atualização seria ambígua). Deduplique o lote pela chave antes (veja Deduplicação).

A mesma ideia, rodando aqui

O SQLite não tem MERGE, mas tem upsert com INSERT … ON CONFLICT. O efeito é o mesmo para os dois primeiros casos: atualiza o 106 e insere o 111.

SQL · SQLite
INSERT INTO pedidos (id, cliente_id, data, status, valor) VALUES
  (106, 3, '2024-06-03', 'entregue', 250.0),
  (111, 6, '2024-06-06', 'entregue', 80.0)
ON CONFLICT(id) DO UPDATE SET status = excluded.status, valor = excluded.valor;

SELECT id, cliente_id, status, valor FROM pedidos WHERE id IN (106, 111) ORDER BY id;

Saída

id  | cliente_id | status   | valor
--- | ---------- | -------- | -----
106 | 3          | entregue | 250
111 | 6          | entregue | 80
  • Merge em tabela grande lê os arquivos que podem conter as chaves do lote. Filtrar o alvo pela partição ou data no ON (e Z-ORDER/clustering pela chave) reduz o que é lido.
  • O MERGE é uma transação Delta: ou o lote inteiro entra, ou nada muda.

Fontes

Conhecimento compartilhado pela Genesis Innovation.