Este artigo é uma continuação sobre Liquid Clustering. Se estiver chegando agora leia a Parte 1 aqui.
O Liquid Clustering foi projetado para melhorar uma ampla gama de cenários de processamento de dados, mas ele se destaca especialmente nos seguintes casos de uso abaixo.
Colunas de alta cardinalidade muito filtradas: Tabelas onde as consultas frequentemente filtram por colunas com altíssimo número de valores distintos (por exemplo, IDs, timestamps precisos) geralmente não se beneficiam de particionamento clássico, mas ganham desempenho com Liquid Clustering. Como ele pode clusterizar por essas colunas sem explodir o número de arquivos, consultas que filtram pequenos intervalos de valores (ex.: um ID específico, um intervalo de tempo) irão ler consideravelmente menos dados do que antes.
Dados com distribuição desigual (skew): Quando alguns valores de uma coluna concentram uma parcela enorme dos dados (skew), as técnicas tradicionais sofrem – partições podem ficar desbalanceadas e Z-order não lida bem se um valor domina. O Liquid Clustering, por ser incremental e autoajustável, resiste melhor a skew, distribuindo dados em arquivos de forma mais uniforme. Isso beneficia tabelas onde, por exemplo, um país específico contém 90% dos registros, evitando que consultas em outros países ainda assim tenham que atravessar arquivos enormes dessa parte dominante.
Tabelas em rápido crescimento (alta taxa de ingestão): Se os dados chegam em alta velocidade ou em grandes lotes, exigindo constantes manutenções de layout, o Liquid Clustering reduz esse esforço. Ele foi pensado para escalabilidade, lidando com acréscimos contínuos de dados com menos intervenção manual. Tabelas que antes precisariam de repartition ou Z-order diário para não degradar, com Liquid Clustering podem operar por mais tempo de forma eficiente apenas com otimizações incrementais. Isso se traduz em menos janelas de manutenção e mais disponibilidade dos dados para uso imediato.
Workloads com gravações concorrentes: Cenários onde múltiplos jobs ETL ou streams escrevem simultaneamente na tabela se beneficiam da capacidade de escrita concorrente proporcionada pelo Liquid Clustering. Por exemplo, imagine uma aplicação IoT onde diferentes fontes enviam dados para a mesma tabela Delta – antigamente seria necessário particionar talvez por dispositivo ou por fonte para evitar conflitos; agora pode-se clusterizar por uma coluna de query (ex.: timestamp) enquanto vários escritores inserem juntos sem problemas. Isso simplifica a arquitetura de ingestão para data lakes unificados.
Padrões de acesso mutáveis ao longo do tempo: Data Warehouses e Lakes corporativos frequentemente veem suas workloads de consulta mudarem conforme evoluem as perguntas de negócio. Um dia as análises focam por região, no outro por categoria de produto. O Liquid Clustering brilha nesses casos pois acompanha mudanças de padrão sem exigir reconstrução da tabela. Você pode ajustar as colunas de cluster conforme as novas necessidades (ou usar o modo automático), permitindo que mesmo uma tabela muito antiga possa ser “reotimizada” para novas queries sem migrações. Isso prolonga a vida útil das tabelas e adia ou elimina projetos de re-particionamento caros.
Quando o particionamento tradicional seria ineficaz: Há situações em que nenhuma chave de partição única parece adequada – ou resultaria em partições demais ou de menos. Por exemplo, uma tabela onde um campo de data diária geraria partições pequenas demais, enquanto sem partição os arquivos ficam gigantes. O Liquid Clustering cobre esse “meio termo” melhor, pois consegue organizar os dados internamente por data (ou outra coluna) sem criar pastas separadas para cada valor. Assim, evita tanto o problema de “muitas partições” quanto o de “poucas partições”, entregando um layout balanceado de forma automática.
Otimização do Liquid Clustering
Para otimizar o uso do Liquid Clustering em diferentes cargas de trabalho, podemos considerar algumas recomendações práticas de acordo com o tipo de workload. Vejamos algumas.
Ingestão Contínua (Streaming): Para fluxos de dados em tempo real entrando na tabela, habilite o clustering já no processo de ingestão (usando a API de writeStream.clusterBy). Desse modo, cada micro-lote já grava dados aproximadamente ordenados. Combine isso com auto-compaction ou jobs de OPTIMIZE frequentes para mesclar micro-lotes passados. O resultado será uma tabela continuamente atualizada e bem organizada, pronta para consultas quase em tempo real. Atenção apenas ao checkpointing do stream e à latência adicionada pelo clustering-on-write – em geral, é um impacto pequeno diante do benefício em consultas subsequentes.
Consultas Analíticas Pesadas: Se a principal característica for ler grandes volumes de dados (por exemplo, queries de BI varrendo meses ou anos de histórico), considere fazer um OPTIMIZE FULL inicial após ativar o Liquid Clustering (especialmente se a tabela já tinha muito dado não clusterizado). Isso vai garantir que mesmo os dados antigos fiquem alinhados ao novo critério de cluster, aproveitando o máximo de data skipping. Depois, adapte a frequência de otimização incremental conforme a cadência de novos dados. Para workloads muito intensos de leitura, vale também monitorar estatísticas de skipping (via DESCRIBE EXTENDED ou logs de execução) para ver se as colunas de clustering escolhidas estão de fato evitando I/O de leitura como esperado. Se não estiverem, reavalie as colunas ou a ordem delas.
Cargas de Atualização/Merge frequente: Em casos de uso onde há muitas atualizações, upserts ou merges (como tabelas que acumulam eventos ou dimensões que sofrem mudanças), o Liquid Clustering continua válido, mas lembre-se de que atualizações podem introduzir fragmentação – por exemplo, linhas atualizadas podem ser marcadas como removidas e adicionadas novamente em outra região de arquivo (deletion vectors). A recomendação é similar: executar otimizações periódicas para recolocar esses dados no lugar certo e limpar arquivos removidos fantasma. A vantagem é que, mesmo com muitas atualizações, você não precisa reorganizar toda a tabela manualmente; concentre-se apenas em rodar as compactações e confiar que o mecanismo de clustering manterá a ordem lógica. Além disso, a concorrência aprimorada ajuda nos merges: múltiplos merges em diferentes partes da tabela terão menos conflitos do que teriam se todos estivessem limitados a mesma partição física.
Workloads com diversidade de consultas: Se o seu Lake atende a diferentes times com diferentes padrões de query (por exemplo, times de Ciência de Dados explorando colunas diversas), tirar proveito do clustering automático pode ser interessante. Embora ainda em fase de amadurecimento, essa funcionalidade deixará que o Databricks detecte novas colunas que valha a pena clusterizar ao identificar tendências nas workloads. Enquanto isso, manualmente você pode monitorar o uso: ferramentas de análise de queries (como os query history do Databricks ou logs do Spark) podem revelar quais filtros são mais frequentes. Esteja preparado para eventualmente alterar as chaves de cluster para sintonizar com as consultas predominantes de cada período. Essa adaptabilidade é algo que o Liquid Clustering torna possível com mínimo esforço.
David Matos
Referências:
Formação Apache Spark e Databricks 4.0
Use liquid clustering for Delta tables
Comparativo Técnico de Plataformas de Dados – Databricks, Microsoft Fabric e Snowflake
1 thought on “Casos de Uso e Otimização de Liquid Clustering no Databricks”