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.
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.
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.