Usar clustering líquido para tabelas Delta

Importante

O clustering líquido do Delta Lake está disponível em Visualização Pública no Databricks Runtime 13.3 e superior. Há suporte para clustering líquido no Databricks Runtime 12.2 LTS e superior. Consulte Compatibilidade de tabelas com clustering líquido.

O clustering líquido Delta Lake substitui o particionamento de tabelas e ZORDER para simplificar as decisões de layout de dados e otimizar o desempenho da consulta. O clustering líquido fornece flexibilidade para redefinir chaves de clustering sem reescrever os dados existentes, permitindo que o layout de dados evolua junto com as necessidades analíticas ao longo do tempo.

Aviso

O Databricks Runtime 13.3 LTS e superior é obrigatório para criar, gravar ou OPTIMIZE Tabelas Delta com o clustering líquido habilitado.

Observação

Tabelas com clustering líquido habilitado dão suporte à simultaneidade no nível de linha no Databricks Runtime 13.3 LTS e superior. A simultaneidade no nível de linha geralmente está disponível no Databricks Runtime 14.2 e superior para todas as tabelas com vetores de exclusão habilitados. Consulte Níveis de isolamento e conflitos de gravação no Azure Databricks.

Para que serve o clustering líquido?

O Databricks recomenda o clustering líquido para todas as novas tabelas Delta. A seguir estão exemplos de cenários que se beneficiam do clustering:

  • Tabelas geralmente filtradas por colunas de alta cardinalidade.
  • Tabelas com distorção significativa na distribuição dos dados.
  • Tabelas que crescem rapidamente e exigem esforço de manutenção e ajuste.
  • Tabelas com requisitos de gravação simultânea.
  • Tabelas com padrões de acesso que mudam ao longo do tempo.
  • Tabelas onde uma chave de partição típica pode deixar a tabela com muitas ou poucas partições.

Habilitar o clustering líquido

Você pode habilitar o cluster líquido em uma tabela existente ou durante a criação da tabela. O clustering não é compatível com particionamento ou ZORDER e requer que o cliente do Azure Databricks gerencie todas as operações de layout e otimização para dados em sua tabela. Depois de habilitado, execute OPTIMIZE trabalhos normalmente para agrupar dados incrementalmente. Consulte Como acionar o clustering.

Para habilitar o clustering líquido, adicione a frase CLUSTER BY a uma instrução de criação de tabela, como nos exemplos abaixo:

Observação

No Databricks Runtime 14.2 e superior, você pode usar APIs de DataFrame e API DeltaTable em Python ou Scala para habilitar o clustering líquido.

SQL

-- Create an empty table
CREATE TABLE table1(col0 int, col1 string) USING DELTA CLUSTER BY (col0);

-- Using a CTAS statement
CREATE EXTERNAL TABLE table2 CLUSTER BY (col0)  -- specify clustering after table name, not in subquery
LOCATION 'table_location'
AS SELECT * FROM table1;

-- Using a LIKE statement to copy configurations
CREATE TABLE table3 LIKE table1;

Python

# Create an empty table
(DeltaTable.create()
  .tableName("table1")
  .addColumn("col0", dataType = "INT")
  .addColumn("col1", dataType = "STRING")
  .clusterBy("col0")
  .execute())

# Using a CTAS statement
df = spark.read.table("table1")
df.write.format("delta").clusterBy("col0").saveAsTable("table2")

# CTAS using DataFrameWriterV2
df = spark.read.table("table1")
df.writeTo("table1").using("delta").clusterBy("col0").create()

Scala

// Create an empty table
DeltaTable.create()
  .tableName("table1")
  .addColumn("col0", dataType = "INT")
  .addColumn("col1", dataType = "STRING")
  .clusterBy("col0")
  .execute()

// Using a CTAS statement
val df = spark.read.table("table1")
df.write.format("delta").clusterBy("col0").saveAsTable("table2")

// CTAS using DataFrameWriterV2
val df = spark.read.table("table1")
df.writeTo("table1").using("delta").clusterBy("col0").create()

Aviso

As tabelas criadas com clustering líquido habilitado têm vários recursos de tabela Delta habilitados na criação e usam o gravador Delta versão 7 e o leitor versão 3. É possível substituir a habilitação de alguns desses recursos. Confira Substituir a habilitação de recursos padrão (opcional).

As versões do protocolo de tabela não podem ser downgraded e as tabelas com clustering habilitado não podem ser lidas por clientes do Delta Lake que não oferecem suporte a todos os recursos de tabela de protocolo do leitor Delta habilitados. Confira Como o Azure Databricks gerencia a compatibilidade de recursos do Delta Lake?.

No Databricks Runtime 13.3 LTS e posteriores, você pode habilitar o clustering líquido em uma tabela Delta não particionada existente usando a seguinte sintaxe:

ALTER TABLE <table_name>
CLUSTER BY (<clustering_columns>)

Substituir a habilitação de recursos padrão (opcional)

É possível substituir o comportamento padrão que habilita os recursos da tabela Delta durante a habilitação do clustering líquido. Isso impede que os protocolos de leitor e gravador associados a esses recursos de tabela sejam atualizados. Você precisa ter uma tabela existente para concluir as seguintes etapas:

  1. Use ALTER TABLE para definir a propriedade da tabela que desabilita um ou mais recursos. Por exemplo, para desabilitar vetores de exclusão, execute o seguinte:

    ALTER TABLE table_name SET TBLPROPERTIES ('delta.enableDeletionVectors' = false);
    
  2. Habilite o clustering líquido na tabela executando o seguinte:

    ALTER TABLE <table_name>
    CLUSTER BY (<clustering_columns>)
    

A tabela a seguir fornece informações sobre os recursos Delta que você pode substituir e como a habilitação afeta a compatibilidade com as versões do Databricks Runtime.

Recurso Delta Compatibilidade do runtime Propriedade para substituir a habilitação Impacto da desabilitação no clustering líquido
Vetores de exclusão Leituras e gravações exigem o Databricks Runtime 12.2 lTS e superior. 'delta.enableDeletionVectors' = false A simultaneidade no nível de linha está desabilitada, tornando um conflito mais provável entre as transações e as operações de clustering. Consulte Conflitos de gravação com simultaneidade em nível de linha.

Os comandos DELETE, MERGE e UPDATE podem ser executados mais lentamente.
Acompanhamento de linhas As gravações exigem o Databricks Runtime 13.3 LTS e posteriores. Pode ser lido em qualquer versão do Databricks Runtime. 'delta.enableRowTracking' = false A simultaneidade no nível de linha está desabilitada, tornando um conflito mais provável entre as transações e as operações de clustering. Consulte Conflitos de gravação com simultaneidade em nível de linha.
Pontos de Verificação V2 As leituras e as gravações exigem o Databricks Runtime 13.3 LTS e superior. 'delta.checkpointPolicy' = 'classic' Nenhum impacto no comportamento do clustering líquido.

Escolher chaves de clustering

O Databricks recomenda a escolha de chaves de clustering com base em filtros de consulta comumente usados. As chaves de clustering podem ser definidas em qualquer ordem. Se duas colunas estiverem correlacionadas, você só precisará adicionar uma delas como uma chave de clustering.

O clustering dá suporte aos seguintes tipos de dados para chaves de clustering:

  • Data
  • Timestamp
  • TimestampNTZ (requer Databricks Runtime 14.3 LTS ou superior)
  • String
  • Inteiro
  • Longo
  • Short
  • Float
  • Double
  • Decimal
  • Byte
  • Booliano

Se você estiver convertendo uma tabela existente, considere as seguintes recomendações:

Técnica atual de otimização de dados Recomendação para chaves de clustering
Particionamento no estilo Hive Use colunas de partição como chaves de clustering.
Indexação de ordem Z Use as colunas ZORDER BY como chaves de cluster.
Particionamento no estilo Hive e ordem Z Use colunas de partição e colunas de ZORDER BY como chaves de clustering.
Colunas geradas para reduzir a cardinalidade (por exemplo, data para um carimbo de data/hora) Use a coluna original como uma chave de clustering e não crie uma coluna gerada.

Gravar dados em uma tabela clusterizada

Você deve usar um cliente gravador Delta que ofereça suporte a todos os recursos de tabela de protocolo de gravação Delta usados pelo clustering líquido. No Azure Databricks, você deve usar o Databricks Runtime 13.3 LTS e superior.

A maioria das operações não agrupa automaticamente os dados na gravação. As operações que agrupam na gravação incluem o seguinte:

  • INSERT INTO operações
  • Instruções CTAS
  • COPY INTO do formato Parquet
  • spark.write.format("delta").mode("append")

Observação

O clustering na gravação é um aplicativo de melhor esforço e não é aplicado nas seguintes situações:

  • Se uma operação de gravação exceder 512 GB de dados.
  • Se a subconsulta SELECT contiver uma transformação, filtro ou junção.
  • Se as colunas projetadas não forem as mesmas da tabela de origem.

Como nem todas as operações aplicam clustering líquido, o Databricks recomenda a execução frequente de OPTIMIZE para garantir que todos os dados sejam agrupados com eficiência.

Como acionar clustering

Para disparar o clustering, você deve usar o Databricks Runtime 13.3 LTS ou superior. Use o comando OPTIMIZE em sua tabela, como no exemplo a seguir:

OPTIMIZE table_name;

O clustering líquido é incremental, o que significa que os dados só são reescritos conforme necessário para acomodar dados que precisam ser clusterizados. Os arquivos de dados com chaves de clustering que não correspondem aos dados a serem clusterizados não são regravados.

Para obter o melhor desempenho, o Databricks recomenda o agendamento de trabalhos OPTIMIZE regulares para agrupar dados. Para tabelas com muitas atualizações ou inserções, o Databricks recomenda agendar um trabalho OPTIMIZE a cada uma ou duas horas. Como o clustering líquido é incremental, a maioria dos trabalhos OPTIMIZE para tabelas clusterizadas é executada rapidamente.

Ler dados de uma tabela clusterizada

Você pode ler dados em uma tabela clusterizada usando qualquer cliente Delta Lake que ofereça suporte à leitura de vetores de exclusão. Para obter melhores resultados de consulta, inclua chaves de clustering em seus filtros de consulta, como no exemplo a seguir:

SELECT * FROM table_name WHERE cluster_key_column_name = "some_value";

Alterar chaves de clustering

Você pode alterar as chaves de clustering de uma tabela a qualquer momento executando um comando ALTER TABLE, como no exemplo a seguir:

ALTER TABLE table_name CLUSTER BY (new_column1, new_column2);

Quando você altera as chaves de clustering, as operações de OPTIMIZE e gravação subsequentes usam a nova abordagem de clustering, mas os dados existentes não são regravados.

Você também pode desativar o clustering definindo as chaves como NONE, como no exemplo a seguir:

ALTER TABLE table_name CLUSTER BY NONE;

A definição de chaves de cluster para NONE não reescreve dados que já foram clusterizados, mas impede que operações futuras de OPTIMIZE usem chaves de cluster.

Veja como a tabela é agrupada

Você pode usar DESCRIBE comandos para ver as chaves de clustering de uma tabela, como nos exemplos a seguir:

DESCRIBE TABLE table_name;

DESCRIBE DETAIL table_name;

Tabelas compatibilidade para tabelas com o clustering líquido

O Databricks recomenda utilizar o Databricks Runtime 13.3 LTS ou superior para todas as cargas de trabalho que leem ou gravam em tabelas com o clustering líquido habilitado.

As tabelas criadas com clustering líquido no Databricks Runtime 14.1 e superior utilizam os pontos de verificação v2 por padrão. Você pode fazer a leitura e gravar tabelas com pontos de verificação v2 no Databricks Runtime 13.3 LTS e superior.

Você pode desabilitar pontos de verificação v2 e protocolos de tabela de downgrade para ler tabelas com clustering líquido no Databricks Runtime 12.2 LTS e superior. Consulte Remover os recursos da tabela Delta.

Limitações

As seguintes limitações existem:

  • Você só pode especificar colunas com estatísticas coletadas para chaves de clustering. Por padrão, as primeiras 32 colunas em uma tabela Delta têm estatísticas coletadas.
  • Você pode especificar até 4 colunas como chaves de clustering.
  • As cargas de trabalho de Streaming Estruturado não dão suporte a clustering em gravação.