Condividi tramite


Usare il clustering liquido per le tabelle Delta

Il clustering dinamico di Delta Lake sostituisce il partizionamento delle tabelle e ZORDER per semplificare le decisioni relative al layout dei dati e ottimizzare 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. Il clustering liquido si applica sia alle tabelle di streaming che alle viste materializzate.

Importante

Databricks consiglia di usare Databricks Runtime 15.2 e versioni successive per tutte le tabelle con clustering liquido abilitato. Il supporto dell'anteprima pubblica con limitazioni è disponibile in Databricks Runtime 13.3 LTS e versioni successive.

Nota

Le tabelle con "liquid clustering" 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, che include sia tabelle di streaming (STS) che viste materializzate (MV). Di seguito sono riportati alcuni esempi di scenari che traggono vantaggio dal clustering:

  • Le tabelle vengono spesso filtrate per colonne ad alta cardinalità.
  • Tabelle con differenze significative nella distribuzione dei dati.
  • Tabelle che aumentano rapidamente e richiedono operazioni di manutenzione e ottimizzazione.
  • Tabelle con requisiti di scrittura simultanei.
  • 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 il clustering liquido in una tabella esistente o durante la creazione di tabelle. Il clustering non è compatibile con il partizionamento o ZORDERe richiede l'utilizzo di Azure Databricks per gestire tutte le operazioni di layout e ottimizzazione dei dati nella tua tabella. Dopo l'abilitazione del clustering liquido, 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 frase CLUSTER BY a un'istruzione di creazione di una 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) 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()

In Databricks Runtime 16.0 e versioni successive, usando scritture di streaming strutturato, è possibile creare tabelle con clustering liquido abilitato, come negli esempi seguenti.

Python

(spark.readStream.table("source_table")
  .writeStream
  .clusterBy("column_name")
  .option("checkpointLocation", checkpointPath)
  .toTable("target_table")
)

Scala

spark.readStream.table("source_table")
  .writeStream
  .clusterBy("column_name")
  .option("checkpointLocation", checkpointPath)
  .toTable("target_table")

Avviso

Le tabelle create con il clustering liquido abilitato hanno diverse funzionalità della tabella Delta attivate al momento della creazione. Utilizzano la versione 7 di Delta writer e la versione 3 di Delta reader. È 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. Si veda In che modo Azure Databricks gestisce la compatibilità delle funzionalità di Delta Lake?.

È possibile abilitare il clustering liquido in una tabella Delta non partizionata esistente usando la sintassi seguente:

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

Importante

Il comportamento predefinito non applica il clustering ai dati scritti in precedenza. Per forzare il clustering per tutti i record, è necessario usare OPTIMIZE FULL. Consultare Force reclustering per tutti i record.

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

È possibile sostituire il comportamento predefinito che abilita le funzionalità della tabella Delta durante l'attivazione del raggruppamento liquido. Ciò impedisce l'aggiornamento dei protocolli lettore e scrittore associati a tali funzionalità delle tabelle. Per completare la procedura seguente, è necessario disporre di una tabella esistente:

  1. Utilizzare ALTER TABLE per impostare la proprietà della tabella 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 su cui è possibile eseguire l'override e in che modo 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 operazioni di lettura e scrittura 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 riga 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 alle colonne usate più di frequente nei filtri di query. Le chiavi di clustering possono essere definite in qualsiasi ordine. Se due colonne sono altamente correlate, è sufficiente includerne una come chiave di clustering.

È possibile specificare fino a quattro chiavi di clustering. Per le tabelle più piccole (inferiori a 10 TB), l'uso di più chiavi di clustering (ad esempio, quattro) può ridurre le prestazioni quando si filtra una singola colonna rispetto all'uso di un minor numero di chiavi di clustering (ad esempio, due). Tuttavia, man mano che le dimensioni della tabella aumentano, la differenza di prestazioni con l'uso di più chiavi di clustering per le query a colonna singola diventa trascurabile.

È possibile specificare solo colonne con statistiche raccolte come chiavi di clustering. Per impostazione predefinita, vengono raccolte statistiche per le prime 32 colonne di una tabella Delta. Vedere Specificare le colonne statistiche Delta.

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

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 colonne ZORDER BY come chiavi di clustering.
Partizionamento in stile Hive e ordine Z Usare sia le colonne di partizione che le colonne ZORDER BY 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.

Le operazioni eseguite dal cluster in scrittura includono quanto segue:

  • INSERT INTO Operazioni
  • CTASistruzioni e RTAS
  • COPY INTO dal formato Parquet
  • spark.write.mode("append")

Le scritture di Structured Streaming non attivano mai il clustering in scrittura. Si applicano limitazioni aggiuntive. Vedere Limitazioni.

Il clustering in fase di scrittura viene attivato solo quando i dati nella transazione soddisfano una soglia di dimensioni. Queste soglie variano in base al numero di colonne di clustering e sono inferiori per le tabelle gestite di Unity Catalog rispetto ad altre tabelle Delta.

Numero di colonne di clustering Dimensioni di soglia per le tabelle gestite del catalogo Unity Dimensioni di soglia per altre tabelle Delta
1 64 MB 256 MB
2 256 MB 1 GB
3 512 MB 2 GB
4 1 GB 4 GB

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

L'ottimizzazione predittiva esegue automaticamente comandi OPTIMIZE per le tabelle abilitate. Consulta Ottimizzazione predittiva per le tabelle gestite di Unity Catalog.

Per attivare il clustering, è necessario usare Databricks Runtime 13.3 LTS o versione successiva. Usare il comando OPTIMIZE 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'attività OPTIMIZE ogni una o due ore. Poiché il clustering liquido è incrementale, la maggior parte dei processi OPTIMIZE per le tabelle in cluster viene eseguita rapidamente.

Force reclustering per tutti i record

In Databricks Runtime 16.0 e versioni successive è possibile forzare il clustering di tutti i record in una tabella con la sintassi seguente:

OPTIMIZE table_name FULL;

Importante

Eseguendo OPTIMIZE FULL, tutti i dati esistenti vengono riorganizzati secondo necessità. Per le tabelle di grandi dimensioni che in precedenza non sono state raggruppate nelle chiavi specificate, questa operazione potrebbe richiedere ore.

Eseguire il comando OPTIMIZE FULL quando si abilita il clustering per la prima volta o si modificano le chiavi di clustering. Se in precedenza è stata eseguita OPTIMIZE FULL e non sono state apportate modifiche alle chiavi di clustering, OPTIMIZE FULL viene eseguito come OPTIMIZE. Usare sempre OPTIMIZE FULL per garantire che il layout dei dati rifletta le chiavi di clustering correnti.

Leggere i dati da una tabella clusterizzata

È 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 comando ALTER TABLE, 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 i comandi DESCRIBE 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 fluido

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 i checkpoint v2 nel 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. Vedi le funzionalità della tabella delta "drop".

Limiti

Esistono le limitazioni seguenti:

  • In Databricks Runtime 15.1 e versioni successive il clustering in scrittura non supporta le query di origine che includono filtri, join o aggregazioni.
  • I carichi di lavoro di flusso strutturato non supportano il clustering in scrittura.
  • In Databricks Runtime 15.4 LTS e versioni precedenti non è possibile creare una tabella con clustering liquido abilitato usando una scrittura Structured Streaming. È possibile usare Structured Streaming per scrivere dati in una tabella esistente con clustering liquido abilitato.