Ottimizzazione unione casuale bassa nelle tabelle Delta

Il comando Delta Lake MERGE consente agli utenti di aggiornare una tabella delta con condizioni avanzate. Può aggiornare i dati da una tabella di origine, una vista o un dataframe in una tabella di destinazione usando il comando MERGE. Tuttavia, l'algoritmo corrente non è completamente ottimizzato per la gestione delle righe non modificate . Con l'ottimizzazione unione casuale bassa, le righe non modificate vengono escluse da un'operazione di shuffling costosa necessaria per l'aggiornamento delle righe corrispondenti.

Perché è necessaria un'unione casuale bassa

Attualmente l'operazione MERGE viene eseguita da due esecuzioni di join. Il primo join usa l'intera tabella di destinazione e i dati di origine per trovare un elenco di file toccati della tabella di destinazione, incluse le righe corrispondenti. Successivamente, esegue il secondo join leggendo solo i file toccati e i dati di origine, per eseguire l'aggiornamento effettivo della tabella. Anche se il primo join consiste nel ridurre la quantità di dati per il secondo join, potrebbe essere ancora presente un numero elevato di righe non modificate nei file toccati . La prima query di join è più leggera perché legge solo le colonne nella condizione di corrispondenza specificata. Il secondo per l'aggiornamento della tabella deve caricare tutte le colonne, che comporta un processo di shuffling costoso.

Con l'ottimizzazione unione casuale bassa, Delta mantiene temporaneamente il risultato della riga corrispondente dal primo join e lo usa per il secondo join. In base al risultato, esclude le righe non modificate dal processo di shuffling elevato. Ci sarebbero due processi di scrittura separati per le righe corrispondenti e le righe non modificate , quindi potrebbe comportare un numero 2x di file di output rispetto al comportamento precedente. Tuttavia, il miglioramento delle prestazioni previsto supera il possibile problema di file di piccole dimensioni.

Disponibilità

Nota

  • L'unione casuale bassa è disponibile come funzionalità di anteprima.

È disponibile nei pool di Synapse per Apache Spark versioni 3.2 e 3.3.

Versione Disponibilità Default
Delta 0.6 / Spark 2.4 No -
Delta 1.2 / Spark 3.2 false
Delta 2.2 / Spark 3.3 true

Vantaggi dell'unione casuale bassa

  • Le righe non modificate nei file toccati vengono gestite separatamente e non passano attraverso l'operazione MERGE effettiva. Consente di risparmiare il tempo di esecuzione MERGE complessivo e le risorse di calcolo. Il guadagno sarebbe maggiore quando vengono copiate molte righe e vengono aggiornate solo alcune righe.
  • Gli ordini di riga vengono mantenuti per le righe non modificate. Pertanto, i file di output di righe non modificate potrebbero essere comunque efficienti per ignorare i dati se il file è stato ordinato o Z-ORDERED.
  • Ci sarebbe un sovraccarico ridotto anche per il peggiore dei casi in cui la condizione MERGE corrisponde a tutte le righe nei file interessati.

Come abilitare e disabilitare l'unione casuale bassa

Dopo aver impostato la configurazione per il pool o la sessione, tutti i modelli di scrittura Spark useranno la funzionalità .

Per usare l'ottimizzazione unione casuale bassa, abilitarla usando la configurazione seguente:

  1. Scala e PySpark
spark.conf.set("spark.microsoft.delta.merge.lowShuffle.enabled", "true")
  1. Spark SQL
SET `spark.microsoft.delta.merge.lowShuffle.enabled` = true

Per controllare il valore di configurazione corrente, usare il comando come illustrato di seguito:

  1. Scala e PySpark
spark.conf.get("spark.microsoft.delta.merge.lowShuffle.enabled")
  1. Spark SQL
SET `spark.microsoft.delta.merge.lowShuffle.enabled`

Per disabilitare la funzionalità, modificare la configurazione seguente, come illustrato di seguito:

  1. Scala e PySpark
spark.conf.set("spark.microsoft.delta.merge.lowShuffle.enabled", "false")
  1. Spark SQL
SET `spark.microsoft.delta.merge.lowShuffle.enabled` = false