Usar agrupamento líquido para tabelas Delta

Importante

O agrupamento de líquidos Delta Lake está disponível no Public Preview no Databricks Runtime 13.3 e superior. Existe algum suporte para clustering líquido no Databricks Runtime 12.2 LTS e superior. Consulte Compatibilidade para tabelas com agrupamento líquido.

O cluster líquido Delta Lake substitui o particionamento de tabelas e ZORDER simplifica as decisões de layout de dados e otimiza o desempenho da consulta. O clustering líquido proporciona flexibilidade para redefinir chaves de clustering sem reescrever dados existentes, permitindo que o esquema de dados evolua juntamente com as necessidades analíticas ao longo do tempo.

Aviso

O Databricks Runtime 13.3 LTS e superior é necessário para criar, gravar ou OPTIMIZE tabelas Delta com clustering líquido habilitado.

Nota

As tabelas com clustering líquido habilitado suportam simultaneidade em nível de linha no Databricks Runtime 13.3 LTS e superior. A simultaneidade em nível de linha está geralmente 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 agrupamento de líquidos?

O Databricks recomenda o agrupamento líquido para todas as novas tabelas Delta. Seguem-se alguns exemplos de cenários que beneficiam do clustering:

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

Habilitar 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 Azure Databricks gerencie todas as operações de layout e otimização para dados em sua tabela. Uma vez habilitado, execute OPTIMIZE trabalhos normalmente para agrupar dados incrementalmente. Consulte Como acionar clustering.

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

Nota

No Databricks Runtime 14.2 e superior, você pode usar APIs DataFrame e API DeltaTable em Python ou Scala para habilitar 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 leitor versão 3. Você pode substituir a ativação de alguns desses recursos. Consulte Substituir ativação de recurso padrão (opcional).

As versões de protocolo de tabela não podem ser rebaixadas e as tabelas com clustering habilitado não são legíveis por clientes Delta Lake que não suportam todos os recursos de tabela de protocolo de leitor Delta habilitados. Consulte Como o Azure Databricks gerencia a compatibilidade de recursos do Delta Lake?.

No Databricks Runtime 13.3 LTS e superior, 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 ativação de recurso padrão (opcional)

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

  1. Use ALTER TABLE para definir a propriedade table que desabilita um ou mais recursos. Por exemplo, para desativar 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 de tempo de execução Propriedade para substituir a habilitação Impacto da incapacidade no agrupamento de líquidos
Vetores de exclusão As leituras e gravações requerem o Databricks Runtime 12.2 lTS e superior. 'delta.enableDeletionVectors' = false A simultaneidade em nível de linha é desabilitada, tornando as transações e as operações de cluster mais propensas a conflitos. Consulte Conflitos de gravação com simultaneidade em nível de linha.

DELETE, MERGEe UPDATE os comandos podem ser executados mais lentamente.
Rastreamento de linha As gravações requerem o Databricks Runtime 13.3 LTS e superior. Pode ser lido a partir de qualquer versão do Databricks Runtime. 'delta.enableRowTracking' = false A simultaneidade em nível de linha é desabilitada, tornando as transações e as operações de cluster mais propensas a conflitos. Consulte Conflitos de gravação com simultaneidade em nível de linha.
Pontos de verificação V2 As leituras e gravações requerem o Databricks Runtime 13.3 LTS e superior. 'delta.checkpointPolicy' = 'classic' Sem impacto no comportamento de agrupamento de líquidos.

Escolher chaves de clustering

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

O clustering suporta os seguintes tipos de dados para chaves de clustering:

  • Date
  • Carimbo de Data/Hora
  • TimestampNTZ (requer Databricks Runtime 14.3 LTS ou superior)
  • String
  • Número inteiro
  • Longo
  • Curto
  • Float
  • Duplo
  • Decimal
  • Byte
  • Boolean

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 estilo colmeia Use colunas de partição como chaves de clustering.
Indexação de ordem Z Use as ZORDER BY colunas como chaves de clustering.
Particionamento estilo colmeia e ordem Z Use colunas de partição e ZORDER BY colunas como chaves de clustering.
Colunas geradas para reduzir a cardinalidade (por exemplo, data de 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 de gravador Delta que ofereça suporte a todos os recursos de tabela de protocolo de gravação Delta usados pelo cluster 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 se 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")

Nota

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 512GB de dados.
  • Se a SELECT subconsulta contiver uma transformação, filtro ou associação.
  • Se as colunas projetadas não forem iguais à tabela de origem.

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

Como acionar o clustering

Para acionar o clustering, você deve usar o Databricks Runtime 13.3 LTS ou superior. Use o OPTIMIZE comando 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 os dados que precisam ser agrupados. Os arquivos de dados com chaves de clustering que não correspondem aos dados a serem agrupados não são regravados.

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

Ler dados de uma tabela agrupada

Você pode ler dados em uma tabela clusterizada usando qualquer cliente Delta Lake que ofereça suporte a vetores de exclusão de leitura. 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 ALTER TABLE comando, como no exemplo a seguir:

ALTER TABLE table_name CLUSTER BY (new_column1, new_column2);

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

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

ALTER TABLE table_name CLUSTER BY NONE;

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

Veja como a tabela está 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;

Compatibilidade para tabelas com agrupamento líquido

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

As tabelas criadas com clustering líquido no Databricks Runtime 14.1 e superior usam pontos de verificação v2 por padrão. Você pode ler e escrever tabelas com pontos de verificação v2 no Databricks Runtime 13.3 LTS e superior.

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

Limitações

As seguintes limitações existem:

  • Só pode especificar colunas com estatísticas recolhidas para chaves de clustering. Por predefinição, as primeiras 32 colunas numa tabela Delta têm estatísticas recolhidas.
  • Pode especificar até 4 colunas como chaves de clustering.
  • As cargas de trabalho de Transmissão em Fluxo Estruturada não suportam clustering-on-write.