Data Become

Z-Order: Otimizando consultas no Delta Lake

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
    %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);
    

    Python
    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

    Leave a Comment

    O seu endereço de email não será publicado. Campos obrigatórios marcados com *

    Scroll to Top