Compattazione delle tabelle Delta

I file della tabella Delta si frammentano con il tempo. La frammentazione aumenta il sovraccarico delle operazioni di file, riduce l'efficienza della compressione e può limitare il parallelismo del lettore. La compattazione riscrive molti file di piccole dimensioni in un minor numero di file di dimensioni corrette in modo che Spark possa leggere ed elaborare i dati in modo più efficiente.

Il OPTIMIZE comando è l'operazione di compattazione primaria. Raggruppa i file di piccole dimensioni in contenitori destinati a una dimensione file ideale, quindi li riscrive in storage.

Per linee guida trasversali ai carichi di lavoro sulle strategie di compattazione tra SQL Analytics Endpoint, Power BI Direct Lake e Spark, vedere Manutenzione e ottimizzazione delle tabelle tra carichi di lavoro.

Metodi di compattazione

Microsoft Fabric offre diversi approcci per mantenere dimensioni ottimali dei file nelle tabelle Delta:

OPTIMIZE comando

Il OPTIMIZE comando è l'operazione di base per compattare le tabelle Delta. Riscrive i file di piccole dimensioni in file di dimensioni maggiori per migliorare il layout dei dati nelle tabelle Delta.

OPTIMIZE dbo.table_name
Proprietà Description Valore predefinito Configurazione sessione
minFileSize I file inferiori a questa soglia vengono raggruppati e riscritti come file di dimensioni maggiori. 1073741824 (1 GB) spark.databricks.delta.optimize.minFileSize
maxFileSize Dimensioni del file di destinazione prodotte dal OPTIMIZE comando . 1073741824 (1 GB) spark.databricks.delta.optimize.maxFileSize

OPTIMIZE è idempotente, ma un minFileSize sovradimensionato può aumentare l'amplificazione della scrittura. Ad esempio, con minFileSize impostato su 1 GB, un file da 900 MB potrebbe essere riscritto dopo una piccola scrittura aggiuntiva. Per indicazioni automatiche sulla gestione delle dimensioni dei file, vedere Dimensioni del file di destinazione adattivo.

OPTIMIZE con Z-Order

Quando si usa la ZORDER BY clausola , OPTIMIZE riscrivere i file attivi in modo che le righe con valori simili vengano raggruppate negli stessi file. Il layout collocato migliora l'esclusione dei file con i filtri selettivi. Usare l'ordine Z quando:

  • Le query filtrano spesso due o più colonne insieme (ad esempio, date + customer_id) e
  • Questi predicati sono sufficientemente selettivi da permettere il salto a livello di file, riducendo così il numero di file analizzati.
OPTIMIZE dbo.table_name ZORDER BY (column1, column2)

OPTIMIZE con V-Order

La VORDER clausola comporta l'applicazione dell'ottimizzazione dell'ordine V nei file con ambito di compattazione. Per altre informazioni sull'ordine V, vedere la documentazione dettagliata.

OPTIMIZE dbo.table_name VORDER

È possibile combinare Z-Order e V-Order in un singolo comando. Spark applica le operazioni in questo ordine: compattazione bin → ordine Z → ordine V.

OPTIMIZE dbo.table_name ZORDER BY (column1, column2) VORDER

Il comportamento di V-Order durante OPTIMIZE dipende dal modo in cui si invoca il comando:

Invocazione Behavior
OPTIMIZE table VORDER Forza V-Order sui file riscritti, indipendentemente dalle impostazioni della sessione o della tabella.
OPTIMIZE table (nessuna VORDER parola chiave) Eredita il comportamento di V-Order da TBLPROPERTIES("delta.parquet.vorder.enabled") se impostato; in caso contrario, esegue il fallback alla configurazione spark.sql.parquet.vorder.defaultdella sessione .

OPTIMIZE con raggruppamento a liquido

Il clustering liquido viene specificato come opzione di tabella; per informazioni dettagliate, vedere Abilitare il clustering liquido . Quando il clustering liquido è abilitato, OPTIMIZE esegue la riscrittura fisica che applica i criteri di clustering.

Importante

I dati vengono raggruppati solo quando OPTIMIZE viene eseguito su tabelle abilitate per il clustering liquido. Le normali operazioni di scrittura non raggruppano i dati. Avere una strategia di compattazione, come l'uso della compattazione automatica o la pianificazione manuale di lavori di ottimizzazione, è fondamentale per garantire che i vantaggi dei dati clustered (ovvero il miglioramento del salto dei file Delta) possano essere realizzati.

Ottimizzazione rapida

Ottimizzazione rapida analizza in modo intelligente i file di tabella Delta e ignora le operazioni di compattazione che probabilmente non migliorano significativamente le prestazioni.

Invece di compattare i file in modo cieco ogni volta che esistono file di piccole dimensioni, l'ottimizzazione rapida valuta se ogni contenitore candidato (gruppo di file di piccole dimensioni) soddisfa gli obiettivi di compattazione delle procedure consigliate configurabili. Fast Optimize esegue la compattazione solo in un contenitore di file se è probabile che l'unione raggiunga le dimensioni minime di destinazione o se sono presenti troppi file di piccole dimensioni. In caso contrario, ignora il gruppo o riduce il numero di file compattati.

SET spark.microsoft.delta.optimize.fast.enabled = TRUE

L'ottimizzazione veloce può essere regolata in base ai requisiti di compattazione.

Proprietà Description Valore predefinito Configurazione sessione
minNumFiles Numero di file di piccole dimensioni che devono esistere in un contenitore per l'esecuzione dell'ottimizzazione se il bin non contiene dati sufficienti stimati per produrre un file compattato . 50 spark.microsoft.delta.optimize.fast.minNumFiles
parquetCoefficient Moltiplicato per la dimensione minima ottimizzata del file di contesto per determinare la quantità minima di dati di piccoli file che devono esistere in un contenitore affinché il contenitore possa essere incluso nel processo di compattazione. 1.3 spark.microsoft.delta.optimize.fast.parquetCoefficient

Annotazioni

I parquetCoefficient risultati comportano che la dimensione target di un bin sia maggiore della dimensione minima del file di destinazione nel contesto di ottimizzazione. Questo coefficiente rappresenta la realtà che la combinazione di più file parquet di piccole dimensioni comporta una compressione migliore e quindi meno dati rispetto alla somma di file di piccole dimensioni. Aumentare il valore per rendere più prudente la frequenza con cui l’ottimizzazione rapida salta i bin, oppure diminuirlo per consentire criteri più permissivi nel salto dei bin.

Come funziona

L'ottimizzazione rapida introduce controlli aggiuntivi prima che i contenitori vengano compattati. Per ogni contenitore candidato, l'ottimizzazione rapida valuta:

  • Quantità stimata di dati non elaborati nel contenitore (somma di piccole dimensioni dei file)
  • Indica se la combinazione dei file di piccole dimensioni è stimata per produrre un file che soddisfi le dimensioni minime di destinazione configurate
  • Indica se il contenitore contiene almeno il numero minimo configurato di file di piccole dimensioni

L'ottimizzazione rapida valuta ogni contenitore di file di piccole dimensioni e compatta solo i bin che probabilmente raggiungono la dimensione minima di destinazione o superano il numero minimo di file. I contenitori che non soddisfano queste soglie vengono ignorati o parzialmente compattati. Saltare i bin non ottimali riduce le riscritture non necessarie, riduce l'amplificazione della scrittura e rende le attività di OPTIMIZE più idempotenti.

Screenshot che mostra la velocità di valutazione dell'ottimizzazione se un contenitore è compattato.

Annotazioni

L'implementazione esatta è soggetta a un'evoluzione nel tempo.

L'ottimizzazione rapida consente di ridurre i dati riscritti in un ciclo di vita di una tabella Delta. Come illustrato nel diagramma seguente, l'ottimizzazione rapida ignora i bin non ottimali, ottenendo processi più veloci e più idempotenti OPTIMIZE con meno amplificazione di scrittura.

Screenshot che mostra come l'ottimizzazione rapida risulti in una minore riscrittura dei dati nel tempo.

Annotazioni

Solo a scopo illustrativo, i diagrammi precedenti presuppongono che le dimensioni del file scritto dalla compattazione siano la somma delle dimensioni dei file di piccole dimensioni. Implica anche un parquetCoefficient valore pari a 1.

Limitazioni
  • Non applicabile alle operazioni di clustering liquido e ordine Z
  • Ottimizzazione rapida non modifica il comportamento della compattazione automatica

Destinazioni di compattazione a livello di file

Per evitare la riscrittura dei dati precedentemente considerati compattati (sufficientemente grandi) in base alla modifica degli obiettivi di dimensione min e max dei file per la compattazione, è possibile abilitare spark.microsoft.delta.optimize.fileLevelTarget.enabled per prevenire la ricompattazione dei file già compattati. Se abilitata, i file non vengono ricompiatti se in precedenza soddisfano almeno la metà delle dimensioni del file di destinazione al momento della compattazione. Il mantenimento degli obiettivi a livello di file riduce al minimo l'amplificazione della scrittura quando le dimensioni dell'obiettivo di compattazione cambiano nel tempo (ad esempio, dalla valutazione e impostazione adattiva della dimensione dei file di destinazione e dall'impostazione di un obiettivo più grande). Se abilitato, il OPTIMIZE_TARGET_SIZE tag viene aggiunto ai nuovi file quando OPTIMIZE viene eseguito o per qualsiasi operazione di scrittura se è impostata la delta.targetFileSize proprietà della tabella o delta.targetFileSize.adaptive .

Annotazioni

Sebbene non sia abilitato per impostazione predefinita, Microsoft consiglia di abilitare le destinazioni di compattazione a livello di file per limitare potenziali amplificazioni di scrittura.

SET spark.microsoft.delta.optimize.fileLevelTarget.enabled = TRUE

Compattazione automatica

La compattazione automatica valuta l'integrità delle partizioni dopo ogni operazione di scrittura. Quando rileva una frammentazione eccessiva dei file (troppi file di piccole dimensioni) all'interno di una partizione, attiva un'operazione sincrona OPTIMIZE immediatamente dopo il commit della scrittura. Questo approccio basato su writer per la manutenzione dei file è ottimale perché la compattazione viene eseguita solo quando viene determinata a livello di codice come utile.

Abilitare a livello di sessione

Impostare spark.databricks.delta.autoCompact.enabled a livello di sessione per abilitare la compattazione automatica per le nuove tabelle create nella sessione Spark:

SET spark.databricks.delta.autoCompact.enabled = TRUE

Abilitare a livello di tabella

Impostare la proprietà delta.autoOptimize.autoCompact della tabella per abilitare la compattazione automatica per tabelle specifiche:

CREATE TABLE dbo.table_name
TBLPROPERTIES ('delta.autoOptimize.autoCompact' = 'true')

Usare l'opzione delta.autoOptimize.autoCompact DataFrameWriter per abilitare la compattazione automatica durante la creazione di una tabella:

df.write.option('delta.autoOptimize.autoCompact', 'true').saveAsTable('dbo.table_name')

Abilitare la stessa proprietà di tabella in una tabella esistente:

ALTER TABLE dbo.table_name
SET TBLPROPERTIES ('delta.autoOptimize.autoCompact' = 'true')

Ridurre il sovraccarico di valutazione

A partire da Spark Runtime 2.0 di Fabric (Delta 4.1), è possibile abilitare la modalità di compattazione automatica onCheckpointOnly. Per impostazione predefinita, la compattazione automatica valuta i metadati dei file dopo ogni operazione di scrittura per determinare se una tabella contiene troppi file di piccole dimensioni. Con onCheckpointOnly, la valutazione viene posticipata alle operazioni di checkpoint del log (in genere ogni 10 commit). Al momento del checkpoint, lo snapshot della tabella è già completamente ricostruito, quindi la valutazione legge dai metadati già presenti in memoria invece di richiedere una scansione aggiuntiva. La valutazione posticipata riduce il sovraccarico per commit, garantendo al tempo stesso la compattazione periodica delle tabelle.

SET spark.microsoft.delta.autoCompact.onCheckpointOnly.enabled = TRUE