Ottimizzare il layout del file di dati

L'ottimizzazione predittiva viene eseguita OPTIMIZE automaticamente nelle tabelle gestite di Unity Catalog. Databricks consiglia di abilitare l'ottimizzazione predittiva per tutte le tabelle gestite di Unity Catalog per semplificare la manutenzione dei dati e ridurre i costi di archiviazione. Vedere Ottimizzazione predittiva per le tabelle gestite di Unity Catalog.

Il OPTIMIZE comando riscrive i file di dati per migliorare il layout dei dati per le tabelle Delta. Per le tabelle con clustering liquido abilitato, OPTIMIZE riscrive i file di dati per raggruppare i dati in base alle chiavi di clustering liquido. Per le tabelle con partizioni definite, la compattazione dei file e il layout dei dati vengono eseguiti all'interno delle partizioni.

Le tabelle senza clustering liquido possono includere facoltativamente una ZORDER BY clausola per migliorare il clustering dei dati in caso di riscrittura. Databricks consiglia di usare clustering liquido invece di partizioni, ZORDERo altri approcci di layout dei dati.

Vedere OPTIMIZE.

Esempi di sintassi

Per attivare la compattazione, eseguire il OPTIMIZE comando :

SQL

OPTIMIZE table_name

Python

from delta.tables import *
deltaTable = DeltaTable.forName(spark, "table_name")
deltaTable.optimize().executeCompaction()

Scala

import io.delta.tables._
val deltaTable = DeltaTable.forName(spark, "table_name")
deltaTable.optimize().executeCompaction()

Se si dispone di una grande quantità di dati e si vuole solo ottimizzare un subset di dati, è possibile specificare un predicato di partizione facoltativo usando WHERE:

SQL

OPTIMIZE table_name WHERE date >= '2022-11-18'

Python

from delta.tables import *
deltaTable = DeltaTable.forName(spark, "table_name")
deltaTable.optimize().where("date='2021-11-18'").executeCompaction()

Scala

import io.delta.tables._
val deltaTable = DeltaTable.forName(spark, "table_name")
deltaTable.optimize().where("date='2021-11-18'").executeCompaction()

Nota

  • L'ottimizzazione della compressione bin è idempotente, ovvero se viene eseguita due volte nello stesso set di dati, la seconda esecuzione non ha alcun effetto.
  • Il bin-packaging mira a produrre file di dati uniformemente bilanciati in relazione alle dimensioni del disco, ma non necessariamente al numero di tuple per ogni file. Tuttavia, le due misure sono più spesso correlate.
  • Le API Python e Scala per l'esecuzione OPTIMIZE dell'operazione sono disponibili in Databricks Runtime 11.3 LTS e versioni successive.

I lettori delle tabelle Delta usano l'isolamento dello snapshot, il che significa che non vengono interrotti quando OPTIMIZE rimuove i file non necessari dal log delle transazioni. OPTIMIZE non apporta modifiche correlate ai dati alla tabella, quindi una lettura prima e dopo un oggetto OPTIMIZE ha gli stessi risultati. L'esecuzione OPTIMIZE in una tabella che è un'origine di streaming non influisce sui flussi correnti o futuri che considerano questa tabella come origine. OPTIMIZE restituisce le statistiche sui file (min, max, total e così via) per i file rimossi e i file aggiunti dall'operazione. Optimize stats contiene anche le statistiche di ordinamento Z, il numero di batch e le partizioni ottimizzate.

È anche possibile compattare automaticamente file di piccole dimensioni usando la compattazione automatica. Vedere Compattazione automatica per Delta Lake in Azure Databricks.

Con quale frequenza è consigliabile eseguire OPTIMIZE?

Abilitare l'ottimizzazione predittiva per le tabelle gestite di Unity Catalog per garantire l'esecuzione OPTIMIZE automatica quando è conveniente.

Quando si sceglie la frequenza con cui eseguire OPTIMIZE, esiste un compromesso tra prestazioni e costi. Per migliorare le prestazioni delle query dell'utente finale, eseguire OPTIMIZE più spesso. Ciò comporta un costo più elevato a causa dell'aumento dell'utilizzo delle risorse. Per ottimizzare i costi, eseguirlo meno spesso.

Databricks consiglia di iniziare con l'esecuzione OPTIMIZE su base giornaliera e quindi di regolare la frequenza per bilanciare i compromessi sui costi e sulle prestazioni.

Qual è il tipo di istanza migliore per l'esecuzione OPTIMIZE (bin-packaging e Z-Ordering) su?

Entrambe le operazioni richiedono un elevato utilizzo di CPU ed eseguono grandi quantità di codifica e decodifica Parquet.

Databricks consiglia i tipi di istanza ottimizzati per il calcolo. OPTIMIZE trae vantaggio anche dalle unità SSD collegate.