Compattare i file di dati con ottimizzazione in Delta Lake

Vedere OPTIMIZE.

Delta Lake in Azure Databricks può migliorare la velocità di lettura delle query da una tabella. Un modo per migliorare questa velocità consiste nell'unire file di piccole dimensioni in file più grandi.

Nota

In Databricks Runtime 13.3 e versioni successive Databricks consiglia di usare il clustering per il layout di tabella Delta. Vedere Usare il clustering liquido per le tabelle Delta.

Databricks consiglia di usare l'ottimizzazione predittiva per l'esecuzione OPTIMIZE automatica per le tabelle Delta. Vedere Ottimizzazione predittiva per Delta Lake.

Esempi di sintassi

Per attivare la compattazione, eseguire il OPTIMIZE comando :

SQL

OPTIMIZE delta.`/data/events`

Python

from delta.tables import *
deltaTable = DeltaTable.forPath(spark, "/data/events")
deltaTable.optimize().executeCompaction()

Scala

import io.delta.tables._
val deltaTable = DeltaTable.forPath(spark, "/data/events")
deltaTable.optimize().executeCompaction()

oppure, in alternativa:

SQL

OPTIMIZE events

Python

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

Scala

import io.delta.tables._
val deltaTable = DeltaTable.forName(spark, "events")
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 events WHERE date >= '2022-11-18'

Python

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

Scala

import io.delta.tables._
val deltaTable = DeltaTable.forName(spark, "events")
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?

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.