Aplicar Liquid Clustering nas tabelas Delta

O Liquid Clustering é uma estratégia flexível de layout de dados para tabelas Delta no Microsoft Fabric. Ele substitui o particionamento estático no estilo Hive e a manutenção manual do Z-Order por agrupamento declarativo e adaptável a mudanças. Você define em quais colunas aplicar o clustering, e o Fabric Spark Runtime gerencia automaticamente o layout físico dos dados.

Use este artigo para:

  • Entenda como a clusterização líquida funciona e quando usá-la.
  • Compare o clustering líquido ao particionamento e ao Z-Order.
  • Configure o clustering em suas tabelas.
  • Entenda o clustering líquido incremental (Runtime 2.0+).
  • Ajuste o comportamento do clustering com as configurações de sessão.

O que é clusterização líquida?

O agrupamento líquido organiza os dados nos arquivos de uma tabela Delta para que linhas com valores semelhantes nas colunas de agrupamento fiquem agrupadas. O layout permite um salto de arquivos aprimorado durante a execução da consulta: quando uma consulta filtra por colunas de clustering, o mecanismo lê apenas os arquivos cujos intervalos de valores correspondem ao predicado, pulando os demais.

Ao contrário do particionamento, o agrupamento líquido:

  • Não cria estruturas físicas de diretórios para cada valor de coluna.
  • Não exige que você escolha colunas de clustering no momento da criação da tabela (elas podem ser alteradas posteriormente).
  • Lida com colunas de alta cardinalidade sem criar possíveis pequenos problemas de arquivo de milhares de partições minúsculas.
  • Aplica a otimização de layout durante OPTIMIZE, não no momento da gravação.

Benefícios sobre particionamento e ordem Z

O clustering líquido oferece vantagens significativas em relação ao particionamento no estilo Hive e à Ordem Z em termos de flexibilidade, manutenção e manipulação de padrões de dados em evolução.

Comparado ao particionamento no estilo Hive

Aspecto Particionamento no estilo hive Agrupamento de líquidos
Granularidade Um diretório por valor distinto (ou combinação) Intervalos de valores no nível do arquivo, sem diretórios
Alta cardinalidade Cria milhares de pequenos arquivos/diretórios Lida naturalmente; agrupa os dados em arquivos com o tamanho adequado
Alterações de coluna Requer reescrita de tabela completa ALTER TABLE ... CLUSTER BY aplica-se no próximo OPTIMIZE
Caminho de gravação A coluna de partição deve ser conhecida no momento da gravação Qualquer coluna pode ser agrupada posteriormente
Problema de arquivo pequeno Comum com streaming ou inserções frequentes Gerenciado pela OPTIMIZE compactação

Em comparação com Z-Order

Aspecto Ordem Z Agrupamento de líquidos
Alterações de coluna Deve ser executado novamente OPTIMIZE ZORDER BY (...) com novas colunas ALTER TABLE ... CLUSTER BY persiste a definição
Suporte incremental Nenhum modo incremental; usar WHERE para limitar o escopo manualmente O modo incremental (Runtime 2.0+) processa apenas arquivos novos, alterados ou não íntegros automaticamente
Metadata Nenhuma definição de coluna persistente Colunas de clustering armazenadas em metadados de tabela
Layout de várias colunas Curva Z-Order aplicada durante a otimização Z-Order para uma coluna de clustering; curva de Hilbert para 2 ou mais colunas, proporcionando localidade de dados otimizada

A clusterização líquida usa Z-Order para layouts de coluna única e a curva de Hilbert para duas ou mais colunas — uma melhoria em relação à Z-Order, que aplica apenas a curva Z-Order à clusterização multidimensional. O clustering líquido encapsula ambos os algoritmos em uma estrutura incremental com reconhecimento de metadados que reduz o custo de manutenção contínua.

Criar uma tabela líquida clusterizada

Defina colunas de clustering usando a cláusula CLUSTER BY ao criar a tabela:

-- Create a new clustered table
CREATE TABLE dbo.sales (
    order_id BIGINT,
    order_date DATE,
    region STRING,
    amount DECIMAL(10,2)
) CLUSTER BY (order_date, region);

-- Create from query results
CREATE TABLE dbo.sales_clustered
CLUSTER BY (order_date, region)
AS SELECT * FROM raw_sales;

-- Enable on existing table
ALTER TABLE dbo.sales_txn CLUSTER BY (order_date, region);

Alterar colunas de clustering

Ao contrário do particionamento, você pode alterar colunas de clustering a qualquer momento sem reescrever dados:

-- Change clustering columns
ALTER TABLE sales CLUSTER BY (region, product_category);

-- Remove clustering (table becomes unclustered)
ALTER TABLE sales CLUSTER BY NONE;

Depois de alterar as colunas de clustering, o novo layout entra em vigor na próxima execução de OPTIMIZE. Os arquivos existentes mantêm seu layout anterior até que sejam reagrupados em cluster.

Aplicar agrupamento com OPTIMIZE

O clustering é aplicado durante o OPTIMIZE comando. Não é necessário especificar colunas na OPTIMIZE instrução, pois a definição de clustering é armazenada nos metadados da tabela:

-- Cluster the table using the defined clustering columns
OPTIMIZE sales;

-- Recluster partial Z-Cubes and Z-Cubes with different clustering keys or clustering providers
OPTIMIZE sales FULL;

Use OPTIMIZE FULL ao alterar as chaves de clustering e quiser recriar Z-Cubes que não estejam em conformidade com a estratégia de clustering atual. Um Cubo Z é a unidade lógica que o clustering líquido usa para agrupar arquivos que compartilham as mesmas colunas de clustering. Os dados são clusterizados em um único Cubo Z até que as chaves de cluster sejam alteradas ou a quantidade de dados exceda 100 GB.

Dica

A partir do Fabric Runtime 2.0, o Native execution engine dá suporte à execução OPTIMIZE em tabelas clusteradas líquidas, fornecendo 30 a 50% desempenho de clustering multidimensional mais rápido. Os runtimes anteriores retornam à execução regular nãocelerada do Spark.

Como funciona o agrupamento líquido

Quando você executa OPTIMIZE em uma tabela líquida clusterizada, acontece o seguinte:

  1. Seleção de arquivos: O mecanismo seleciona os arquivos que precisam de agrupamento.
    • No Runtime 2.0+ (estratégia de clustering incremental), apenas arquivos não clusterizados, com problemas, pequenos ou com vetores de exclusão são selecionados.
    • No Runtime 1.3, todos os arquivos em cada Z-Cube menores que 100 GB são selecionados, independentemente de já estarem bem clusterizados.
  2. Empacotamento em recipientes: os arquivos selecionados são agrupados em recipientes visando a um tamanho ideal de arquivo de saída.
  3. Reparticionamento: os dados em cada compartimento são reparticionados usando uma curva de preenchimento de espaço (curva Hilbert para várias colunas, Z-Order para coluna única).
  4. Gravação de arquivos: Os dados reparticionados são gravados como novos arquivos com faixas de valores estreitas nas colunas de clustering.
  5. Atualização de metadados: o log Delta registra a substituição de arquivo, marcando novos arquivos com metadados de clustering.

O resultado são arquivos com intervalos de valor não sobrepostos (ou minimamente sobrepostos) em colunas de clustering, permitindo que o mecanismo ignore arquivos que não correspondem a predicados de consulta.

Caution

Fabric Runtime 1.3 (Delta 3.2): use clustering líquido com cuidado. Neste ambiente de execução, a clusterização líquida usa uma estratégia de reescrita completa do Z-Cube — todos os arquivos dentro de um Z-Cube são reescritos a cada execução. Um Cubo Z é preservado (ignorado) somente quando seu tamanho excede 100 GB. Para tabelas menores que 100 GB, a reescrita completa significa que cada OPTIMIZE execução reescreve todos os dados da tabela, mesmo quando os dados já estão bem clusterizados. Isso causa uma amplificação de gravação severa.

  • Não use a compactação automática com clustering líquido no Runtime 1.3. Cada gatilho de compactação automática pode causar uma reescrita de tabela completa em vez de apenas agrupar os dados novos/alterados.
  • Evite executar OPTIMIZE após cada operação de gravação. No Runtime 1.3, restrinja o clustering a execuções estratégicas e intencionais e aceite uma menor atualidade do clustering entre essas execuções.

O clustering líquido incremental, que elimina essa amplificação de gravação, só está disponível a partir do Fabric Runtime 2.0.

Agrupamento incremental líquido

A partir de Fabric Runtime 2.0 (Delta 4.1), a clusterização líquida usa uma estratégia incremental de clusterização por padrão. A estratégia incremental é uma melhoria significativa em relação ao comportamento de clustering padrão.

Importante

A clusterização líquida incremental só está disponível no Fabric Runtime 2.0 e em versões posteriores. Em runtimes anteriores, OPTIMIZE usa o comportamento padrão (reescrita completa), em que todos os arquivos dentro de um Z-Cube são reescritos em cada execução.

Por que a estratégia de clustering incremental importa

O algoritmo de clustering padrão reescreve todos os arquivos em um Z-Cube (até 100 GB) em cada OPTIMIZE execução, independentemente de já estarem bem clusterizados. Para uma tabela que recebe pequenos acréscimos, o custo de clustering cresce linearmente com o tamanho da tabela, não com a quantidade de novos dados.

O modo incremental resolve o problema de reescrita completa selecionando apenas os arquivos que realmente precisam de clustering:

  • Arquivos não clusterizados: dados recém-gravados sem metadados de clusterização
  • Arquivos pequenos: arquivos abaixo do limite de tamanho do arquivo de destino
  • Arquivos com vetores de exclusão: arquivos com exclusões acumuladas que excedem o limite de limpeza

Arquivos já bem clusterizados e com tamanho apropriado são ignorados por completo.

Reagrupamento automático

O agrupamento líquido incremental inclui a detecção automática de sobreposição, conhecida como reagrupamento automático, para preservar a qualidade do agrupamento ao longo do tempo. À medida que novos dados chegam, isso pode criar sobreposição entre intervalos de valores nos arquivos, reduzindo a eficácia da omissão de dados. O reagrupamento automático detecta intervalos de valores sobrepostos entre arquivos e reagrupa seletivamente apenas os arquivos afetados.

A reclusterização automática ocorre automaticamente como parte de OPTIMIZE sempre que houver dados novos ou alterados para agrupamento. Não é necessária intervenção manual nem reclusterizações completas agendadas. A estratégia de agrupamento incremental mantém uma qualidade de agrupamento próxima da ideal à medida que os dados evoluem.

Voltar ao comportamento de reescrita total

Se você precisar desabilitar a estratégia de clustering incremental e usar o comportamento de reescrita completa, defina a seguinte configuração:

SET spark.microsoft.delta.optimize.clustering.strategy.incremental = FALSE;

OPTIMIZE sales;

Como alternativa, use OPTIMIZE FULL para uma reclusterização completa de uma só vez, sem alterar as configurações da sessão:

OPTIMIZE sales FULL;

Observação

A estratégia de agrupamento incremental permite intencionalmente um pequeno desvio da disposição teoricamente ideal para obter reduções significativas na amplificação de escrita. A execução OPTIMIZE FULL fecha essa lacuna recriando totalmente os Cubos Z para o ideal teórico, mas com um custo de gravação mais alto.

Referência de configuração

As configurações de sessão a seguir controlam o comportamento da clusterização líquida no Fabric Runtime 2.0+.

Agrupamento incremental

Configuração Tipo Default Descrição
spark.microsoft.delta.optimize.clustering.strategy.incremental booleano true Chave principal para agrupamento incremental. Quando true, OPTIMIZE processa apenas arquivos não clusterizados, com problemas, pequenos e com vetor de exclusão. Quando false, todos os arquivos para Z-Cubes com menos de 100 GB de tamanho são reescritos (comportamento padrão).
spark.microsoft.delta.optimize.clustering.strategy.incremental.autoRecluster booleano true Habilita a detecção automática e o reagrupamento de arquivos com intervalos de dados sobrepostos. Aplica-se somente quando o clustering incremental está habilitado.

Ajuste automático de reclusterização

Essas configurações controlam a sensibilidade e o escopo do reagrupamento automático. As configurações padrão são adequadas para a maioria das cargas de trabalho. Ajuste-os somente quando precisar alterar o equilíbrio entre a qualidade do agrupamento e a amplificação de escrita.

Configuração Tipo Default Descrição
spark.microsoft.delta.optimize.clustering.strategy.incremental.autoRecluster.minOffendingFiles int 4 Número mínimo de arquivos sobrepostos necessários para disparar o reclustering. Valores mais baixos são reagrupados mais cedo (melhor desempenho nas consultas, maior custo de escrita). Deve ser ≥ 2.
spark.microsoft.delta.optimize.clustering.strategy.incremental.autoRecluster.minOverlapThreshold Double 0.75 Limiar da pontuação de sobreposição de dimensão para agrupamento. Pares de arquivos com pontuação acima deste valor são considerados sobrepostos. Deve estar no intervalo (0,25, 1,0]. Valores mais baixos são mais agressivos.

Escolhendo colunas de clustering

Para obter melhores resultados, escolha colunas de clustering com base nos padrões de filtro de consulta mais comuns:

  • Escolha de 1 a 4 colunas que aparecem com frequência em WHERE cláusulas. Mais colunas reduzem a eficácia da omissão de arquivos por coluna da curva de preenchimento espacial e aumentam o tempo necessário para clusterizar os dados.
  • Considere a cardinalidade da coluna. Colunas de baixa cardinalidade produzem menos intervalos de valores distintos, o que reduz o benefício do salto de arquivos quando combinadas com chaves de clustering de alta cardinalidade.
  • A ordem da coluna não afeta o clustering. A ordem das colunas especificadas depois de CLUSTER BY não afeta o agrupamento multidimensional resultante.

Tipos de coluna suportados

Nem todos os tipos de coluna podem ser usados como chaves de clustering. O mecanismo avalia o tipo de dados de cada coluna para determinar a qualificação.

Sempre elegíveis (tipos atômicos):

  • NumericType (ByteType, ShortType, IntegerType, LongType, , FloatType, DoubleType, DecimalType)
  • DateType
  • TimestampType
  • TimestampNTZType
  • StringType

Qualificado condicionalmente:

Observação

Os tipos a seguir podem ser habilitados a partir do Fabric Spark Runtime 2.0 (Delta 4.1)

  • StructType: quando spark.microsoft.delta.clusteredTable.complexTypes.enabled está habilitado, e todos os campos folha são tipos qualificados.
  • ArrayType: quando spark.microsoft.delta.clusteredTable.complexTypes.enabled está habilitado e o tipo de elemento é qualificado.
  • MapType: quando spark.microsoft.delta.clusteredTable.complexTypes.enabled estiver habilitado e os tipos de chave e valor forem ordenáveis e elegíveis.

Não elegível:

  • BinaryType
  • BooleanType
  • NullType

Para os tipos elegíveis equivalentes usados nas estatísticas no nível do arquivo, consulte Ignorar arquivos — tipos de dados elegíveis.

Interação com outros recursos

Característica Behavior
Particionamento Incompatível. Para fins de descarte de arquivos, recomenda-se o clustering líquido em vez do particionamento.
Ordem Z Incompatível. Para fins de eliminação de arquivos, a clusterização líquida é recomendada em vez de Z-Order.
Otimização rápida Compatível a partir do Runtime 2.0. Em runtimes anteriores, a otimização rápida não tem efeito sobre tabelas clusteradas líquidas. Durante OPTIMIZE, ignora o agrupamento quando não houver arquivos pequenos suficientes ou dados suficientes para produzir um arquivo de saída com um tamanho adequado.
Tamanho do arquivo de destino adaptável Compatível. O tamanho-alvo do arquivo definido pela avaliação adaptável é usado como tamanho-alvo para o agrupamento.
Otimizar gravação Compatível. Produz arquivos consolidados durante a gravação, que depois são agrupados durante OPTIMIZE.
Compactação automática Não use com agrupamento líquido na versão 1.3 ou anterior do Runtime. Nesses ambientes de execução, cada acionamento da compactação automática reescreve todos os dados em Z-Cubes menores que 100 GB, causando grave amplificação de gravação. No Runtime 2.0 ou superior, a compactação automática é compatível: o clustering incremental garante que apenas arquivos novos ou com problemas sejam reescritos. A compactação automática cuida da consolidação de arquivos pequenos; OPTIMIZE cuida do layout de agrupamento.
Vetores de deleção Arquivos que excedem o limite de linhas excluídas são selecionados para agrupamento, independentemente de seu status de agrupamento.
V-Order Compatível. V-Order e a clusterização líquida operam em eixos diferentes (layout interno do arquivo vs. faixas de valores entre arquivos). Ambos podem ser aplicados juntos.

Práticas recomendadas

  • Execute OPTIMIZE regularmente após gravações em lote ou em um agendamento para tabelas de streaming, mas somente no Runtime 2.0+, em que a estratégia de clustering incremental torna as execuções frequentes baratas. No Runtime 1.3 e em versões anteriores, cada execução de OPTIMIZE reescreve todos os dados em Z-Cubes com menos de 100 GB, portanto as execuções devem ser deliberadas e infrequentes.
  • Use OPTIMIZE FULL com moderação. Deixe isso para depois de alterar as colunas de clustering ou quando precisar de uma redefinição pontual da qualidade.
  • Monitore a qualidade do clustering verificando as métricas de varredura da consulta (arquivos varridos vs. total de arquivos) na interface do Spark ou nos planos de consulta.
  • Use em conjunto com a otimização de gravação em cargas de trabalho de streaming para garantir que cada microlote produza um número gerenciável de arquivos para agrupamento.