Wiki Delta Lake
Delta Lake: transações ACID sobre arquivos
Uma tabela Delta é Parquet mais um log de transações (_delta_log). O log é o que dá atomicidade, isolamento, esquema e histórico.
Um data lake de arquivos Parquet soltos não tem transação: um job que falha no meio deixa metade dos arquivos escritos, e quem lê naquele instante vê dado pela metade. O Delta Lake resolve isso com um log de transações ao lado dos dados.
O que há numa tabela Delta
- arquivos de dados em Parquet;
- a pasta
_delta_log/, com um arquivo JSON por commit (00000000000000000000.json,…01.json, …) e, de tempos em tempos, um *checkpoint* em Parquet que resume o estado para a leitura não precisar repassar todos os JSON.
Cada commit lista as ações: arquivos adicionados (add), removidos (remove), mudança de esquema (metaData). A versão atual da tabela é o resultado de aplicar o log em ordem.
ACID na prática
- Atomicidade: um commit é a escrita de um arquivo de log. Ou ele existe (a escrita valeu inteira) ou não existe (nada mudou para quem lê).
- Consistência: o esquema fica no log, e uma escrita com coluna de tipo errado é recusada (*schema enforcement*), a não ser que você peça evolução (
mergeSchema). - Isolamento: quem lê usa uma versão fixa do log, então não vê escrita pela metade. Escritores concorrentes usam controle otimista: se dois mexem nos mesmos arquivos, um commit falha com conflito.
- Durabilidade: os dados e o log ficam no armazenamento de objetos (ADLS, S3, GCS).
(pedidos.write.format("delta")
.mode("append")
.saveAsTable("silver.pedidos"))
# esquema com coluna nova: recusado, a menos que se peça
(pedidos_com_canal.write.format("delta")
.mode("append")
.option("mergeSchema", "true")
.saveAsTable("silver.pedidos"))Remover não apaga (ainda)
DELETE e UPDATE não reescrevem o arquivo inteiro no lugar: marcam arquivos antigos como removidos no log e escrevem novos. Os antigos continuam no disco até o VACUUM. É isso que permite voltar no tempo (veja Time travel), e é por isso que a pasta cresce se ninguém roda VACUUM.
- No Databricks, Delta é o formato padrão de tabela.
- *Deletion vectors* (recurso mais novo) marcam linhas apagadas sem reescrever o arquivo, deixando
DELETE/UPDATE/MERGEmais baratos.
Fontes
Conhecimento compartilhado pela Genesis Innovation.