Usare il clustering liquido per le tabelle Delta

Importante

Il clustering liquido delta Lake è disponibile in anteprima pubblica in Databricks Runtime 13.3 e versioni successive. In Databricks Runtime 12.2 LTS esistono alcuni supporti per il clustering liquido e versioni successive. Vedere Compatibilità per le tabelle con clustering liquido.

Il clustering liquido delta Lake sostituisce il partizionamento delle tabelle e ZORDER semplifica le decisioni relative al layout dei dati e ottimizza le prestazioni delle query. Il clustering liquido offre flessibilità per ridefinire le chiavi di clustering senza riscrivere dati esistenti, consentendo al layout dei dati di evolversi insieme alle esigenze analitiche nel tempo.

Avviso

Databricks Runtime 13.3 LTS e versioni successive è necessario per creare, scrivere o OPTIMIZE tabelle Delta con clustering liquido abilitato.

Nota

Le tabelle con clustering liquido abilitato supportano la concorrenza a livello di riga in Databricks Runtime 13.3 LTS e versioni successive. La concorrenza a livello di riga è disponibile a livello generale in Databricks Runtime 14.2 e versioni successive per tutte le tabelle con vettori di eliminazione abilitati. Vedere Livelli di isolamento e conflitti di scrittura in Azure Databricks.

Che cos'è il clustering liquido usato per?

Databricks consiglia il clustering liquido per tutte le nuove tabelle Delta. Di seguito sono riportati alcuni esempi di scenari che traggono vantaggio dal clustering:

  • Le tabelle sono spesso filtrate in base a colonne di cardinalità elevata.
  • Tabelle con differenze significative nella distribuzione dei dati.
  • Tabelle che aumentano rapidamente e richiedono impegno per manutenzione e ottimizzazione.
  • Tabelle con requisiti di scrittura simultanea.
  • Tabelle con modelli di accesso che cambiano nel tempo.
  • Tabelle in cui una chiave di partizione tipica potrebbe lasciare la tabella con troppe o troppo poche partizioni.

Abilitare il clustering liquido

È possibile abilitare un cluster liquido in una tabella esistente o durante la creazione della tabella. Il clustering non è compatibile con il partizionamento o ZORDERe richiede che il client Azure Databricks gestisca tutte le operazioni di layout e ottimizzazione per i dati nella tabella. Dopo l'abilitazione, eseguire OPTIMIZE i processi come di consueto per i dati del cluster in modo incrementale. Vedere Come attivare il clustering.

Per abilitare il clustering liquido, aggiungere la CLUSTER BY frase a un'istruzione di creazione tabella, come negli esempi seguenti:

Nota

In Databricks Runtime 14.2 e versioni successive è possibile usare le API DataFrame e l'API DeltaTable in Python o Scala per abilitare il clustering liquido.

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()

Avviso

Le tabelle create con clustering liquido abilitato hanno numerose funzionalità di tabella Delta abilitate al momento della creazione e usano la versione 7 del writer Delta e la versione 3 del lettore. È possibile eseguire l'override dell'abilitazione di alcune di queste funzionalità. Vedere Override default feature enablement (facoltativo).

Non è possibile effettuare il downgrade delle versioni del protocollo di tabella e le tabelle con clustering abilitato non sono leggibili dai client Delta Lake che non supportano tutte le funzionalità della tabella dei protocolli di lettura Delta abilitate. Vedere How does Azure Databricks manage Delta Lake feature compatibility?.

In Databricks Runtime 13.3 LTS e versioni successive è possibile abilitare il clustering liquido in una tabella Delta non partizionata esistente usando la sintassi seguente:

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

Eseguire l'override dell'abilitazione delle funzionalità predefinite (facoltativo)

È possibile eseguire l'override del comportamento predefinito che abilita le funzionalità della tabella Delta durante l'abilitazione del clustering liquido. Ciò impedisce l'aggiornamento dei protocolli lettore e writer associati a tali funzionalità di tabella. Per completare la procedura seguente, è necessario disporre di una tabella esistente:

  1. Utilizzare ALTER TABLE per impostare la proprietà table che disabilita una o più funzionalità. Ad esempio, per disabilitare i vettori di eliminazione, eseguire le operazioni seguenti:

    ALTER TABLE table_name SET TBLPROPERTIES ('delta.enableDeletionVectors' = false);
    
  2. Abilitare il clustering liquido nella tabella eseguendo quanto segue:

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

La tabella seguente fornisce informazioni sulle funzionalità Delta che è possibile eseguire l'override e sul modo in cui l'abilitazione influisce sulla compatibilità con le versioni di Databricks Runtime.

Funzionalità Delta Compatibilità del runtime Proprietà per eseguire l'override dell'abilitazione Impatto della disabilitazione sul clustering liquido
Vettori di eliminazione Le letture e le scritture richiedono Databricks Runtime 12.2 lTS e versioni successive. 'delta.enableDeletionVectors' = false La concorrenza a livello di riga è disabilitata, rendendo più probabili conflitti tra transazioni e operazioni di clustering. Vedere Conflitti di scrittura con concorrenza a livello di riga.

DELETEI comandi , MERGEe UPDATE potrebbero essere eseguiti più lentamente.
Rilevamento delle righe Le scritture richiedono Databricks Runtime 13.3 LTS e versioni successive. Può essere letto da qualsiasi versione di Databricks Runtime. 'delta.enableRowTracking' = false La concorrenza a livello di riga è disabilitata, rendendo più probabili conflitti tra transazioni e operazioni di clustering. Vedere Conflitti di scrittura con concorrenza a livello di riga.
Checkpoint V2 Le letture e le scritture richiedono Databricks Runtime 13.3 LTS e versioni successive. 'delta.checkpointPolicy' = 'classic' Nessun impatto sul comportamento del clustering liquido.

Scegliere le chiavi di clustering

Databricks consiglia di scegliere le chiavi di clustering in base ai filtri di query di uso comune. Le chiavi di clustering possono essere definite in qualsiasi ordine. Se due colonne sono correlate, è necessario aggiungerle solo come chiave di clustering.

Il clustering supporta i tipi di dati seguenti per le chiavi di clustering:

  • Data
  • Timestamp:
  • TimestampNTZ (richiede Databricks Runtime 14.3 LTS o versione successiva)
  • String
  • Intero
  • Lungo
  • Short
  • Float
  • Double
  • Decimale
  • Byte
  • Booleano

Se si sta convertendo una tabella esistente, prendere in considerazione le raccomandazioni seguenti:

Tecnica di ottimizzazione dei dati corrente Raccomandazione per le chiavi di clustering
Partizionamento in stile Hive Usare le colonne di partizione come chiavi di clustering.
Indicizzazione dell'ordine Z Usare le ZORDER BY colonne come chiavi di clustering.
Partizionamento in stile Hive e ordine Z Usare sia le colonne di partizione che ZORDER BY le colonne come chiavi di clustering.
Colonne generate per ridurre la cardinalità (ad esempio, data per un timestamp) Usare la colonna originale come chiave di clustering e non creare una colonna generata.

Scrivere dati in una tabella cluster

È necessario usare un client di writer Delta che supporta tutte le funzionalità di tabella del protocollo di scrittura Delta usate dal clustering liquido. In Azure Databricks è necessario usare Databricks Runtime 13.3 LTS e versioni successive.

La maggior parte delle operazioni non esegue automaticamente il clustering dei dati in scrittura. Le operazioni eseguite dal cluster in scrittura includono quanto segue:

  • INSERT INTO Operazioni
  • Istruzioni CTAS
  • COPY INTO dal formato Parquet
  • spark.write.format("delta").mode("append")

Nota

Il clustering in scrittura è un'applicazione di tipo best effort e non viene applicata nelle situazioni seguenti:

  • Se un'operazione di scrittura supera i 512 GB di dati.
  • Se la SELECT sottoquery contiene una trasformazione, un filtro o un join.
  • Se le colonne proiettate non corrispondono alla tabella di origine.

Poiché non tutte le operazioni applicano clustering liquido, Databricks consiglia l'esecuzione OPTIMIZE frequente per garantire che tutti i dati siano raggruppati in modo efficiente.

Come attivare il clustering

Per attivare il clustering, è necessario usare Databricks Runtime 13.3 LTS o versione successiva. Usare il OPTIMIZE comando nella tabella, come nell'esempio seguente:

OPTIMIZE table_name;

Il clustering liquido è incrementale, ovvero i dati vengono riscritti solo in base alle esigenze per contenere i dati che devono essere raggruppati. I file di dati con chiavi di clustering che non corrispondono ai dati da raggruppare non vengono riscritti.

Per ottenere prestazioni ottimali, Databricks consiglia di pianificare processi regolari OPTIMIZE nei dati del cluster. Per le tabelle che riscontrano molti aggiornamenti o inserimenti, Databricks consiglia di pianificare un OPTIMIZE processo ogni una o due ore. Poiché il clustering liquido è incrementale, la maggior parte dei OPTIMIZE processi per le tabelle cluster viene eseguita rapidamente.

Leggere i dati da una tabella cluster

È possibile leggere i dati in una tabella in cluster usando qualsiasi client Delta Lake che supporta la lettura dei vettori di eliminazione. Per ottenere risultati ottimali delle query, includere le chiavi di clustering nei filtri di query, come nell'esempio seguente:

SELECT * FROM table_name WHERE cluster_key_column_name = "some_value";

Modificare le chiavi di clustering

È possibile modificare le chiavi di clustering per una tabella in qualsiasi momento eseguendo un ALTER TABLE comando, come nell'esempio seguente:

ALTER TABLE table_name CLUSTER BY (new_column1, new_column2);

Quando si modificano le chiavi di clustering, le operazioni successive OPTIMIZE e di scrittura usano il nuovo approccio di clustering, ma i dati esistenti non vengono riscritti.

È anche possibile disattivare il clustering impostando le chiavi su NONE, come nell'esempio seguente:

ALTER TABLE table_name CLUSTER BY NONE;

L'impostazione delle chiavi del cluster su NONE non riscrive i dati già in cluster, ma impedisce alle operazioni future OPTIMIZE di usare le chiavi di clustering.

Vedere in che modo la tabella è raggruppata

È possibile usare DESCRIBE i comandi per visualizzare le chiavi di clustering per una tabella, come negli esempi seguenti:

DESCRIBE TABLE table_name;

DESCRIBE DETAIL table_name;

Compatibilità per le tabelle con clustering liquido

Databricks consiglia di usare Databricks Runtime 13.3 LTS o versione successiva per tutti i carichi di lavoro che leggono o scrivono da tabelle con clustering liquido abilitato.

Le tabelle create con clustering liquido in Databricks Runtime 14.1 e versioni successive usano checkpoint v2 per impostazione predefinita. È possibile leggere e scrivere tabelle con checkpoint v2 in Databricks Runtime 13.3 LTS e versioni successive.

È possibile disabilitare i checkpoint v2 e effettuare il downgrade dei protocolli di tabella per leggere le tabelle con clustering liquido in Databricks Runtime 12.2 LTS e versioni successive. Vedere Eliminare le funzionalità della tabella Delta.

Limiti

Esistono le limitazioni seguenti:

  • È possibile specificare solo colonne con statistiche raccolte per le chiavi di clustering. Per impostazione predefinita, le prime 32 colonne di una tabella Delta hanno statistiche raccolte.
  • È possibile specificare fino a 4 colonne come chiavi di clustering.
  • I carichi di lavoro di flusso strutturato non supportano il clustering in scrittura.