Usar clustering líquido para tabelas Delta
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.
Importante
O Databricks recomenda usar o Databricks Runtime 15.2 e superior para todas as tabelas com clustering líquido habilitado. O suporte à visualização pública com limitações está disponível no Databricks Runtime 13.3 LTS e superior.
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 a clusterização líquida em uma tabela existente ou durante a criação da tabela. A clusterização não é compatível com o particionamento ou ZORDER
, e requer que você use o Azure Databricks para gerenciar todas as operações de layout e otimização para os dados na sua tabela. Após a clusterização líquida ter sido habilitada, execute os trabalhos OPTIMIZE
como de hábito para dados de cluster incrementais. 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) 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.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.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?.
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:
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);
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.
Você pode especificar até 4 colunas como chaves de clustering. 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. Consulte Especificar as colunas de estatísticas Delta.
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
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.
As operações que agrupam na gravação incluem o seguinte:
INSERT INTO
operações- Instruções
CTAS
eRTAS
COPY INTO
do formato Parquetspark.write.mode("append")
Gravações de streaming estruturadas nunca disparam clustering na gravação. Limitações adicionais se aplicam. Confira Limitações.
O clustering na gravação só dispara quando os dados na transação atendem a um limite de tamanho. Esses limites variam de acordo com o número de colunas de clustering e são menores para tabelas gerenciadas do Catálogo do Unity do que outras tabelas Delta.
Número de colunas de clustering | Tamanho do limite para tabelas gerenciadas do Catálogo do Unity | Tamanho do limite para outras tabelas Delta |
---|---|---|
1 | 64 MB | 256 MB |
2 | 256 MB | 1 GB |
3 | 512 MB | 2 GB |
4 | 1 GB | 4 GB |
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
A otimização preditiva executa automaticamente comandos OPTIMIZE
para tabelas habilitadas. Consulte Otimização preditiva para tabelas gerenciadas do Catálogo do Unity.
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
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:
- No Databricks Runtime 15.1 e abaixo, o clustering na gravação não dá suporte a consultas de origem que incluem filtros, junções ou agregações.
- As cargas de trabalho de Streaming Estruturado não dão suporte a clustering em gravação.
- Não é possível criar uma tabela com clustering líquido habilitado usando uma gravação de Streaming Estruturado. Você pode usar o Streaming Estruturado para gravar dados em uma tabela existente com clustering líquido habilitado.