Introdução
O Delta Lake é uma camada de armazenamento para tabelas ACID em cima de um Data Lake ou armazenamento de objetos. Ele proporciona um universo de funcionalidades para manipulação, gestão e otimização de Data Lakes. Neste artigo, exploraremos como o Delta Lake, de forma automática, otimiza suas tabelas e como podemos melhorar explicitamente a performance de nossas consultas utilizando os comandos OPTIMIZE
e Z-ORDER
.
Layout Otimizado dos Dados
A camada Delta aplica diversas otimizações nas tabelas para garantir:
- Maior Confiabilidade: Imposição do esquema, garantindo a integridade dos dados.
- Log Transacional: Permite acompanhar e auditar diferentes versões das tabelas.
- Transacionalidade: Suporte a transações ACID, permitindo operações como UPSERT, DELETE e MERGE.
- Performance: Otimização de compactação e Data Skipping.
Os dados são armazenados em formato Apache Parquet, um formato orientado a colunas, ideal para integração com motores como Apache Spark e outras ferramentas de big data. Arquivos Parquet armazenam estatísticas sobre cada coluna, como valores mínimos e máximos, no rodapé. Essas estatísticas permitem que os sistemas de processamento pulem seções desnecessárias, melhorando significativamente a leitura dos dados. Este processo é conhecido como Data Skipping.
O Data Skipping no Delta Lake é uma melhoria do processo tradicional em arquivos Parquet, aproveitando ao máximo o esquema da tabela e utilizando índices estatísticos avançados. Esses índices são armazenados como metadados em um arquivo Delta Lake e são usados para identificar quais seções de dados precisam ser lidas para uma consulta específica.
Esses índices são coletados automaticamente quando você escreve dados em uma tabela Delta. No Databricks, esta funcionalidade está ativada por padrão, mas sua efetividade depende do layout dos seus dados. Por padrão, o Delta Lake coleta estatísticas das 32 primeiras colunas definidas no schema. Você pode ajustar essa configuração para considerar mais colunas, mas esteja ciente de que isso aumenta o custo computacional.
Índices Otimizados para Z-Ordering
Para melhorar ainda mais a performance das consultas, você pode utilizar explicitamente o comando Z-ORDER
para indicar quais colunas são chave para o Data Skipping. Se você possui uma coluna frequentemente usada como filtro em suas consultas, como a “data da venda” em uma base de dados de vendas, considere-a para o Z-Order.
Critérios para escolher colunas para Z-Order:
- Campos Frequentes em Consultas: Colunas frequentemente usadas em filtros.
- Alta Cardinalidade: Colunas com muitas diferentes classes. Por exemplo, um campo de gênero (Masculino/Feminino) não é adequado devido à baixa cardinalidade.
- Não Utilizar Colunas de Particionamento: O campo escolhido para Z-Order não deve ser o mesmo utilizado para particionamento.
- Número de Colunas: Use um número limitado de colunas para Z-Order para evitar aumento no tempo de processamento.
Dependendo do seu cenário, o Z-Order pode ser suficiente para alcançar a performance desejada sem a necessidade de particionamento. Para mais detalhes sobre particionamento, consulte nosso artigo sobre o tema.
O Comando Z-Order
O comando ZORDER
é usado com OPTIMIZE
para resolver um dos problemas principais em armazenamento de dados distribuídos: os Small Files. O OPTIMIZE
agrupa pequenos pedaços de dados em arquivos maiores, reduzindo a quantidade de arquivos necessários.
Sintaxe para Z-Order:
%sql
OPTIMIZE vendas ZORDER BY (produto_categoria);
-- Para otimizar uma parte específica, utilize WHERE
OPTIMIZE vendas WHERE data_venda >= "2023-01-01" AND produto_categoria = "Eletrodomésticos" ZORDER BY (produto_categoria);
from delta.tables import DeltaTable
# Carregar a tabela Delta
deltaTable = DeltaTable.forPath(spark, pathToTable) # pathToTable é o caminho da tabela
vendas = deltaTable
# Aplicar Z-Order
vendas.optimize().executeZOrderBy("produto_categoria")
# Para otimizar uma parte específica, utilize WHERE
vendas.optimize() \
.where("data_venda >= '2023-01-01' AND produto_categoria = 'Eletrodomésticos'") \
.executeZOrderBy("produto_categoria")
Conclusão
Embora o Delta Lake aplique automaticamente diversas otimizações, ele permite personalizar configurações específicas para maximizar a performance. Utilizar Z-Order
é uma estratégia poderosa para otimizar consultas em grandes volumes de dados, especialmente quando você tem colunas frequentes em filtros. Continue explorando outras técnicas e otimizações no Databricks para obter o melhor desempenho possível em seus projetos de dados.
referências: Databricks: Delta Lake Data Skipping