programa
Delta Lake: Uma introdução prática com exemplos práticos
Os lagos de dados são o padrão ouro para o armazenamento de grandes quantidades de dados estruturados e não estruturados, mas geralmente enfrentam problemas de inconsistência de dados, evolução de esquemas e problemas de desempenho. O Delta Lake resolve esses desafios adicionando transações ACID, aplicação de esquema e processamento de dados escalonável sobre o Apache Spark.
Neste tutorial, explicarei os conceitos básicos do Delta Lake, incluindo sua arquitetura, recursos e configuração, juntamente com exemplos práticos para ajudar você a começar.
O que é o Delta Lake?
O Delta Lake é umacamada de armazenamento de código aberto projetada para se integrar ao Apache Spark, o que o torna a solução preferida das equipes que usam o ecossistema do Spark. Ele introduz transações ACID (Atomicidade, Consistência, Isolamento, Durabilidade) em ambientes de Big Data.
Ao permitir o gerenciamento robusto de metadados, o controle de versões e a aplicação de esquemas, o Delta Lake aprimora os data lakehouses e garante alta qualidade de dados para cargas de trabalho de análise e aprendizado de máquina.
Características do Delta Lake
- Transações ACID: Garante operações de dados confiáveis e consistentes.
- Aplicação e evolução do esquema: Evita incompatibilidades de esquemas e permite atualizações graduais.
- Viagem no tempo: Permite que você consulte versões anteriores dos dados.
- Gerenciamento otimizado de metadados: Melhora o desempenho da consulta.
- Escalabilidade para cargas de trabalho em lote e de streaming: Oferece suporte ao processamento em lote e à análise de streaming em tempo real.
Arquitetura do lago Delta
O Delta Lake aprimora as arquiteturas de dados tradicionais, especialmente a arquitetura Lambda, ao unificando o processamento de dados em lote e de streaming em uma única estrutura compatível com ACID.
As plataformas de dados que usam o Delta Lake geralmente seguem uma arquitetura de medalhãoque organiza nossos dados em três camadas lógicas definidas da seguinte forma:
- Mesas de bronze: Ingestão de dados brutos de várias fontes (RDBMS, arquivos JSON, dados de IoT, etc.) que servem como fonte imutável da verdade.
- Mesas de prata: Uma visão refinada dos dados por meio de deduplicação, transformações e uniões.
- Mesas de ouro: Insights agregados em nível de negócios para painéis, relatórios ou aplicativos de aprendizado de máquina.
As tabelas Gold podem ser consumidas por ferramentas de business intelligence, permitindo análises em tempo real e apoiando a tomada de decisões.
A arquitetura do medalhão. Fonte da imagem: Databricks
Formato de arquivo do lago Delta
O Delta Lake foi desenvolvido com base no Apache Parquet, um formato de armazenamento de ar de colunaque permite consultas eficientes, compactação e evolução de esquemas. No entanto, o que diferencia o Delta Lake dos data lakes padrão baseados em Parquet é o DeltaLog, um registro de transações quemantém um histórico de todas as alterações feitas em um conjunto de dados.
Os principais componentes do formato de arquivo Delta Lake incluem:
- Registro de transações (
_delta_log/
): - Uma sequência estruturada de arquivos JSON e de pontos de verificação que registram todas as alterações (inserções, atualizações e exclusões) em uma tabela Delta.
- Garante transações ACID, permitindo reversão, viagem no tempo e controle de versão.
- Arquivos de dados (formato Parquet):
- O Delta Lake armazena dados em arquivos Parquet, mas o log de transações rastreia metadados sobre versões e alterações de arquivos.
- Diferentemente dos arquivos Parquet tradicionais, as tabelas Delta suportam operações de atualização, exclusão e mesclagem (que não existem no Parquet padrão).
- Pontos de controle:
- Periodicamente, o Delta Lake compacta os logs de transação JSON em arquivos de ponto de verificação binários, melhorando o desempenho da consulta.
- Esses pontos de verificação ajudam a acelerar as pesquisas de metadados e evitam a degradação do desempenho ao longo do tempo.
Como você pode ver, sem o DeltaLog, os data lakes padrão baseados em Parquet não têm transações ACID e não podem lidar com modificações simultâneas com segurança. O formato de arquivo do Delta Lake permite que o streaming e o processamento em lote coexistam, mantendo a consistência. Por fim, recursos como mesclagem na leitura, compactação e consultas de metadados otimizadas tornam as tabelas Delta altamente eficientes para análises em grande escala.
Configuração do lago Delta
Vamos nos aprofundar na configuração do Delta Lake! Vou dividi-lo em duas etapas simples:
Etapa 1: Instalar o Apache Spark e o Delta Lake
Para começar, verifique se você tem um ambiente do Apache Spark. Em seguida, instale o
Pacote Delta Lake (se você estiver usando Python) com o seguinte comando:
pip install pyspark delta-spark
O comando acima instala o pacote delta-spark
, que equipa sua sessão do Spark com as integrações necessárias do Delta Lake.
Etapa 2: Configurar o Delta Lake com o Spark
Depois de instalar o pacote, configure sua sessão do Spark para usar o Delta Lake com
essas configurações:
from pyspark.sql import SparkSession
# Initialize a SparkSession with Delta support
spark = SparkSession.builder \
.appName("DeltaLakePractice") \
.config("spark.sql.extensions", "io.delta.sql.DeltaSparkSessionExtension") \
.config("spark.sql.catalog.spark_catalog", "org.apache.spark.sql.delta.catalog.DeltaCatalog") \
.getOrCreate()
# Check if Spark is working
print("Spark Session Created Successfully!")
Aqui, a sessão do Spark é definida com duas configurações essenciais. O primeiro permite que você
Delta Lake SQL extensions e o segundo define Delta Lake como o padrão
garantindo que seus dados em formato Delta sejam tratados corretamente.
Noções básicas sobre o Delta Lake
Agora, vamos ver o básico. O Delta Lake permite que você crie tabelas compatíveis com ACID usando uma API DataFrame simples.
Etapa 1: Criação de uma tabela Delta
Crie uma tabela Delta gravando um DataFrame no formato Delta:
# Sample DataFrame creation
data = [("Alice", 34), ("Bob", 45), ("Cathy", 29)]
columns = ["name", "age"]
df = spark.createDataFrame(data, columns)
# Save the DataFrame as a Delta table (overwrite mode replaces any existing data)
df.write.format("delta").mode("overwrite").save("/path/to/delta/table")
O trecho de código acima cria um DataFrame básico e o grava em um caminho especificado usando o formato Delta. O uso do site mode("overwrite")
garante que todos os dados existentes sejam substituídos.
Etapa 2: Leitura de uma tabela Delta
Depois que uma tabela Delta for criada, leia seus dados da seguinte forma:
# Load the Delta table from a specified path
delta_df = spark.read.format("delta").load("/path/to/delta/table")
delta_df.show()
O snippet acima carrega a tabela Delta em um DataFrame e exibe seu conteúdo com o método show()
, confirmando que os dados foram lidos corretamente.
Etapa 3: Gravação em uma tabela Delta (anexar e sobrescrever)
O Delta Lake oferece suporte a vários modos de gravação, permitindo que você adicione novos registros de forma incremental (append) ou substitua dados existentes (overwrite), mantendo as garantias de ACID.
Anexar dados
Anexar novos dados a uma tabela Delta existente:
# New data to append
new_data = [("David", 40)]
new_df = spark.createDataFrame(new_data, columns)
# Append data to the existing Delta table
new_df.write.format("delta").mode("append").save("/path/to/delta/table")
O modo "append"
é usado para adicionar novas linhas à tabela sem afetar os dados existentes.
Sobregravação de dados
Substituir toda a tabela Delta com dados atualizados:
# Updated data for overwrite
updated_data = [("Alice", 35), ("Bob", 46), ("Cathy", 30)]
updated_df = spark.createDataFrame(updated_data, columns)
# Overwrite the current contents of the Delta table
updated_df.write.format("delta").mode("overwrite").save("/path/to/delta/table")
Ao usar o modo "overwrite"
, você substitui o conteúdo da tabela Delta inteiramente pelo novo DataFrame atualizado. novo DataFrame atualizado.
Recursos avançados do Delta Lake
Esta seção aborda algumas das poderosas funcionalidades do Delta Lake além das operações básicas.
Em particular, exploraremos como você pode analisar versões anteriores dos seus dados, gerenciar automaticamente as alterações de esquema e executar transações de várias operações atomicamente.
Viagem no tempo (consulta a versões mais antigas dos dados)
O recurso de viagem no tempo do Delta Lake permite que você acesse versões anteriores da sua tabela. Cada operação de gravação em uma tabela Delta cria uma nova versão para que você possa consultar um estado anterior dos seus dados. Usei esse recurso para auditar alterações de dados, depurar problemas ou restaurar um snapshot anterior se algo der errado.
# Querying an earlier version (version 0) of the Delta table:
historical_df = spark.read.format("delta") \
.option("versionAsOf", 0) \
.load("/path/to/delta/table")
historical_df.show()
Evolução e aplicação do esquema
Conforme os conjuntos de dados evoluem, novas colunas podem ser adicionadas. O Delta Lake pode evoluir automaticamenteo esquema, mesclando novos campos em uma tabela existente e reforçando a consistênciados dados . Isso significa que você não precisa recriar ou ajustar manualmente a tabela sempre que a estrutura de dados for alterada.
Vamos anexar dados com um esquema atualizado usando a evolução automática do esquema:
# Create a DataFrame with an additional "country" column:
new_data = [("Alice", 34, "USA"), ("Bob", 45, "Canada")]
columns = ["name", "age", "country"]
new_df = spark.createDataFrame(new_data, columns)
# Append the new data to the Delta table with schema evolution enabled:
new_df.write.format("delta") \
.mode("append") \
.option("mergeSchema", "true") \
.save("/path/to/delta/table")
Aqui, o DataFrame new_df
contém uma coluna extra, country
. Ao usar option("mergeSchema", "true")
, o mecanismo do Delta Lake atualiza automaticamente o esquema da tabela para acomodar a nova coluna e, ao mesmo tempo, anexar os dados com segurança!
Transações Delta Lake (ACID)
As transações ACID do Delta Lake garantem que operações complexas sejam executadas de forma confiável, mesmo com alta simultaneidade. Isso significa que uma série de operações (como atualizações e inserções) são tratadas como uma única unidade. Se alguma parte datransação falhar, nenhuma alteração será aplicada, garantindo que seus dados permaneçam consistentes.
Vamos executar uma transação atômica com uma operação MERGE
:
-- Execute a MERGE statement in SQL to update or insert data atomically:
MERGE INTO delta./path/to/delta/table AS target
USING (SELECT 'Alice' AS name, 35 AS age, 'USA' AS country) AS source
ON target.name = source.name AND target.country IS NULL
WHEN MATCHED THEN
UPDATE SET target.age = source.age, target.country = source.country
WHEN NOT MATCHED THEN
INSERT (name, age, country) VALUES (source.name, source.age, source.country)
No exemplo acima, o comando MERGE
procura linhas na tabela de destino em que o nome corresponde e o campo country é NULL. Se for encontrada uma correspondência, ele atualiza alinha ; caso contrário, insere um novo registro .
Observe que, mesmo que já exista uma linha para "Alice" na tabela, a condição target.country IS NULL
pode fazer com que a operação insira uma nova linha em vez de atualizar uma com um país não nulo. Esse exemplo demonstra a importância de definir cuidadosamente os critérios de correspondência em operações transacionais.
Práticas recomendadas para o uso do Delta Lake
Aqui estão as práticas recomendadas que sigo ao trabalhar com o Delta Lake. Eles podem ajudar você a criar pipelines de dados eficientes e passíveis de manutenção.
Particionamento eficiente de dados
O particionamento de suas tabelas Delta pode melhorar significativamente o desempenho da consulta quando você lida com grandes conjuntos de dados. ao lidar com grandes conjuntos de dados.
Dica: Ao escrever seu DataFrame, use a opção .partitionBy("column_name")
para dividir seus dados em partes menores e mais gerenciáveis (por exemplo, por data ou categoria). Essa abordagem reduz a quantidade de dados digitalizados durante asconsultas típicasdo site .
Gerenciando metadados com o Delta Lake
O Delta Lake usa um registro de transações ( _delta_log
) para manter os metadados de todas as operações que você realiza na tabela. operações em sua tabela.
Dica: Programe operações de manutenção periódicas (como o comando VACUUM
) para remover arquivos de dados obsoletos e simplificar os metadados. Isso resulta em um desempenho de consulta mais rápido e em um gerenciamento mais fácil de grandes conjuntos de dados.
Otimização do desempenho com a ordenação Z
A ordenação em Z é uma técnica de agrupamento de dados que organiza os dados no disco para melhorar a eficiência da consulta, especialmente ao filtrar colunas específicas:
OPTIMIZE delta./path/to/delta/table
ZORDER BY (name, age);
O comando SQL acima diz ao Delta Lake para reorganizar os dados fisicamente com base nas colunas name
e age
. Com a localização conjunta de valores semelhantes, as consultas que filtram essas colunas examinam menos dados e são executadas mais rapidamente.
Solução de problemas e depuração do Delta Lake
Ao trabalhar com o Delta Lake, você pode ocasionalmente se deparar com obstáculos. A chave é tratar esses desafios como oportunidades para aprofundar seu conhecimento e dominar a tecnologia. Aqui estão alguns dos meus insights práticos e dicas para que você volte ao caminho certo.
Erros e soluções comuns
Você pode encontrar problemas como incompatibilidades de esquema ou alinhamento de partição . Por exemplo, se os dados recebidos não corresponderem ao esquema da tabela, você poderá ver erros durante as operações de gravação. Considere o uso de opções como mergeSchema
para permitir que o Delta Lake se ajuste.
Além disso, se o desempenho da consulta cair, verifique se os dados estão particionados de forma ideal ou se um comando de manutenção como VACUUM
pode ajudar a remover arquivos obsoletos.
Depuração de operações da tabela Delta
Quando as coisas não funcionarem conforme o esperado, não se preocupe - faz parte do processo! Uma ótima primeira etapa é inspecionar o log de transações (encontrado no diretório _delta_log
). Esse registro oferece um histórico detalhado das transações e pode ajudar você a identificar quando e onde as coisas saíram dos trilhos .
Além disso, se você notar inconsistências ou alterações inesperadas, tente usar a viagem no tempo para comparar diferentes versões da tabela. Essa abordagem ajudará você a isolar o problema e a entender os eventos que levaram ao erro.
Conclusão
O Delta Lake traz uma série de vantagens - desde transações ACID robustas e gerenciamento eficiente de metadados até recursos como viagem no tempo e evolução de esquema - que permitem que você crie pipelines de dados resilientes e dimensionáveis. Sua integração com o Apache Spark significa que o Delta Lake pode ser o complemento perfeito para otimizar seus fluxos de trabalho se você já tiver investido no ecossistema do Spark.
Para aqueles que desejam aprofundar seu conhecimento, incentivo você a explorar outros recursos no DataCamp:
- Curso de conceitos de Databricks - Aprenda os princípios básicos por trás do Databricks e do Delta Lake, incluindo como eles aprimoram o processamento de dados e os fluxos de trabalho de análise.
- Curso Big Data Fundamentals with PySpark - Obtenha experiência prática com o Apache Spark e o PySpark, dominando técnicas para processar conjuntos de dados em grande escala com eficiência.
- Curso de Introdução à Engenharia de Dados - Aprenda os conceitos fundamentais da engenharia de dados e crie uma base sólida para gerenciar big data.
- Curso Understanding Modern Data Architecture (Entendendo a arquitetura de dados moderna ) - Explore as práticas recomendadas e as tendências atuais da arquitetura de dados moderna, ajudando você a ficar à frente no cenário de dados dinâmico de hoje.
Bom aprendizado e boa sorte em sua jornada de dados!
Aprimore suas habilidades com o PySpark
Perguntas frequentes
O que é o Delta Lake e como ele difere dos data lakes tradicionais?
O Delta Lake é uma camada de armazenamento de código aberto que adiciona transações ACID, aplicação e evolução de esquemas e recursos de viagem no tempo ao Apache Spark. Isso torna o gerenciamento de dados mais confiável e permite recursos que os data lakes tradicionais não possuem.
Como posso configurar o Delta Lake em meu ambiente do Apache Spark?
Para configurar o Delta Lake, instale o Apache Spark e o pacote delta-spark
(usando um comando como pip install pyspark delta-spark
). Em seguida, configure sua sessão do Spark com as configurações específicas do Delta Lake que habilitam as extensões SQL e designam o Delta como o catálogo padrão.
Quais são os principais recursos que tornam o Delta Lake uma ferramenta valiosa?
Os recursos importantes incluem transações ACID para operações de dados robustas, viagem no tempo para consultar dados históricos, evolução automática de esquemas para lidar com alterações na estrutura de dados e gerenciamento otimizado de metadados para um desempenho de consulta mais rápido.
Que medidas devo tomar se encontrar erros ao trabalhar com o Delta Lake?
Problemas comuns, como incompatibilidade de esquemas ou problemas de particionamento, podem ser resolvidos com o uso de opções como mergeSchema
ou com a otimização das partições de dados. Além disso, a inspeção do site _delta_log
e o uso de consultas de viagem no tempo podem ajudar a identificar e resolver erros.
Quais práticas recomendadas devo seguir ao usar o Delta Lake em meus pipelines de dados?
É recomendável particionar seus dados de forma eficiente, programar tarefas de manutenção periódicas, como VACUUM, para gerenciar arquivos obsoletos, e aproveitar técnicas como a ordenação Z para otimizar o desempenho das consultas - todas elas abordadas na seção de práticas recomendadas do artigo.
Engenheiro de dados com experiência em tecnologias de nuvem Python e Azure, especializado na criação de pipelines de dados escaláveis e processos de ETL. Atualmente está cursando Bacharelado em Ciência da Computação na Universidade de Tanta. Engenheiro de dados certificado pela DataCamp com experiência comprovada em gerenciamento e programação de dados. Ex-estagiário de engenharia de dados da Microsoft na Digital Egypt Pioneers Initiative e Microsoft Beta Student Ambassador, liderando workshops técnicos e organizando hackathons.
Saiba mais sobre engenharia de dados com estes cursos!
curso
Data Management in Databricks
curso
Introduction to Spark SQL in Python

blog
Uma introdução ao DuckDB: O que é e por que você deve usá-lo?
blog
O que é o Data Wrangling? Um guia prático com exemplos

Tim Lu
12 min
blog
Mais de 60 projetos Python para todos os níveis de conhecimento

Bekhruz Tuychiev
16 min
tutorial
Tutorial do Pyspark: Primeiros passos com o Pyspark
tutorial
Tutorial de SQLAlchemy com exemplos
tutorial