Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Delta Lake offre le seguenti opzioni distinte per sovrascritture selettive:
- L'opzione
replaceWheresostituisce atomicamente tutti i record che corrispondono a un predicato specificato. - È possibile sostituire le directory dei dati in base al modo in cui le tabelle vengono partizionate usando sovrascrizioni delle partizioni dinamiche.
Per la maggior parte delle operazioni, Databricks consiglia di usare replaceWhere per specificare i dati da sovrascrivere.
Important
Se i dati sono stati accidentalmente sovrascritti, è possibile usare il ripristino per annullare la modifica.
Sovrascrittura selettiva arbitraria con replaceWhere
È possibile sovrascrivere in modo selettivo solo i dati corrispondenti a un'espressione arbitraria.
Note
SQL richiede Databricks Runtime 12.2 LTS o versione successiva.
Ad esempio, sostituire in modo atomico gli eventi di gennaio nella tabella di destinazione, partizionata da start_date, con i dati in replace_data.
Python
(replace_data.write
.mode("overwrite")
.option("replaceWhere", "start_date >= '2017-01-01' AND end_date <= '2017-01-31'")
.saveAsTable("events")
)
Scala
replace_data.write
.mode("overwrite")
.option("replaceWhere", "start_date >= '2017-01-01' AND end_date <= '2017-01-31'")
.saveAsTable("events")
SQL
INSERT INTO TABLE events REPLACE WHERE start_date >= '2017-01-01' AND end_date <= '2017-01-31' SELECT * FROM replace_data
Questo codice di esempio scrive i dati in replace_data, convalida che tutte le righe corrispondano al predicato ed esegue una sostituzione atomica usando overwrite la semantica. Se i valori nell'operazione non rientrano nel vincolo, l'operazione ha esito negativo e viene generato un errore per impostazione predefinita.
È possibile modificare questo comportamento impostando overwrite i valori all'interno dell'intervallo di predicati e insert dei record che non rientrano nell'intervallo specificato. A tale scopo, disabilitare il controllo del vincolo impostando su spark.databricks.delta.replaceWhere.constraintCheck.enabled false usando una delle impostazioni seguenti:
Python
spark.conf.set("spark.databricks.delta.replaceWhere.constraintCheck.enabled", False)
Scala
spark.conf.set("spark.databricks.delta.replaceWhere.constraintCheck.enabled", false)
SQL
SET spark.databricks.delta.replaceWhere.constraintCheck.enabled=false
Note
REPLACE WHERE accetta un oggetto boolean_expression con alcune restrizioni. Consultare INSERT nel riferimento linguistico SQL.
Comportamento legacy
Se si usa il comportamento legacy di replaceWhere, le query corrispondono solo ai predicati sulle colonne di partizione e ignorano tutti i dati all'esterno dell'intervallo di predicati. Il comando seguente sostituisce in modo atomico il mese di gennaio nella tabella di destinazione, partizionato da date, con i dati in df:
Python
(df.write
.mode("overwrite")
.option("replaceWhere", "birthDate >= '2017-01-01' AND birthDate <= '2017-01-31'")
.saveAsTable("people10m")
)
Scala
df.write
.mode("overwrite")
.option("replaceWhere", "birthDate >= '2017-01-01' AND birthDate <= '2017-01-31'")
.saveAsTable("people10m")
Per usare il comportamento legacy, impostare il spark.databricks.delta.replaceWhere.dataColumns.enabled flag su false:
Python
spark.conf.set("spark.databricks.delta.replaceWhere.dataColumns.enabled", False)
Scala
spark.conf.set("spark.databricks.delta.replaceWhere.dataColumns.enabled", false)
SQL
SET spark.databricks.delta.replaceWhere.dataColumns.enabled=false
Sovrascritture di partizioni dinamiche
La sovrascrittura della partizione dinamica aggiorna solo le partizioni in cui la scrittura esegue il commit di nuovi dati e lascia invariate altre partizioni.
Azure Databricks consiglia REPLACE USING per attivare sovrascrizioni delle partizioni dinamiche. Questa modalità funziona in tutti i tipi di calcolo, inclusi databricks SQL warehouse, calcolo serverless e calcolo classico e non richiede l'impostazione di una configurazione di sessione Spark. Consultare Sovrascritture di partizioni dinamiche con REPLACE USING.
partitionOverwriteMode è una modalità legacy per sovrascrivere le partizioni dinamiche che richiedono l'uso del calcolo classico e l'impostazione di una configurazione di sessione Spark. Non è supportato nel calcolo SQL di Databricks o serverless. Vedi Sovrascrittura delle partizioni dinamiche con partitionOverwriteMode (legacy).
Le sezioni seguenti illustrano come usare ogni modalità.
Sovrascrittura dinamica delle partizioni con REPLACE USING
Databricks Runtime 16.3 e versioni successive supporta le sovrascrizioni delle partizioni dinamiche per le tabelle che usano REPLACE USING. È possibile sovrascrivere in modo selettivo i dati in tutti i tipi di calcolo, senza dover impostare una configurazione di sessione Spark.
REPLACE USING abilita il comportamento di sovrascrittura atomica indipendente dal calcolo che funziona su Databricks SQL Warehouse, calcolo serverless e classico.
REPLACE USING sovrascrive solo le partizioni di destinazione dei dati in ingresso. Tutte le altre partizioni rimangono invariate.
REPLACE USING è supportato solo in SQL. Per informazioni dettagliate, vedere INSERT le informazioni di riferimento sul linguaggio SQL.
Negli esempi seguenti viene REPLACE USINGusato :
INSERT INTO TABLE events
REPLACE USING (event_id, start_date)
SELECT * FROM source_data
Tenere presenti i vincoli e i comportamenti seguenti per sovrascrivere le partizioni dinamiche:
- In Databricks Runtime 17.2 e versioni successive sono supportate tabelle partizionate, tabelle non partizionate e tabelle con clustering liquido.
- In Databricks Runtime da 16.3 a 17.1 sono supportate solo le tabelle partizionate ed è necessario specificare il set completo delle colonne di partizione della tabella nella
USINGclausola . - Verificare sempre che i dati scritti tocchino solo le partizioni previste. Una singola riga nella partizione errata può sovrascrivere involontariamente l'intera partizione.
Se hai bisogno di una logica di corrispondenza più personalizzabile rispetto a quella supportata da REPLACE USING, ad esempio trattando i valori di NULL come uguali, utilizza invece la logica complementare REPLACE ON. Per informazioni dettagliate, vedere INSERT.
Sovrascrittura della partizione dinamica con partitionOverwriteMode (legacy)
Important
Questa funzionalità è in Anteprima Pubblica.
Databricks Runtime 11.3 LTS e versioni successive supportano le sovrascrizioni delle partizioni dinamiche per le tabelle partizionate usando la modalità di sovrascrittura: INSERT OVERWRITE in SQL o una scrittura del DataFrame con df.write.mode("overwrite"). Questo tipo di sovrascrittura è disponibile solo per il calcolo classico, non per databricks SQL warehouse o per il calcolo serverless.
Avviso
Quando possibile, utilizzare INSERT OVERWRITE REPLACE USING anziché "partition overwrite" su INSERT OVERWRITE PARTITION e spark.sql.sources.partitionOverwriteMode=dynamic. La sovrascrittura della partizione può utilizzare dati obsoleti quando si verificano cambiamenti nel partizionamento.
Per usare la modalità di sovrascrittura della partizione dinamica, impostare la configurazione spark.sql.sources.partitionOverwriteMode della sessione Spark su dynamic. In alternativa, è possibile impostare l'opzione DataFrameWriterpartitionOverwriteMode su dynamic. Se presente, l'opzione specifica della query sostituisce la modalità definita nella configurazione della sessione. Il valore predefinito per spark.sql.sources.partitionOverwriteMode è static.
Nell'esempio seguente viene usato partitionOverwriteMode:
SQL
SET spark.sql.sources.partitionOverwriteMode=dynamic;
INSERT OVERWRITE TABLE default.people10m SELECT * FROM morePeople;
Python
(df.write
.mode("overwrite")
.option("partitionOverwriteMode", "dynamic")
.saveAsTable("default.people10m")
)
Scala
df.write
.mode("overwrite")
.option("partitionOverwriteMode", "dynamic")
.saveAsTable("default.people10m")
Tenere presenti i vincoli e i comportamenti seguenti per partitionOverwriteMode:
- Non è possibile impostare
overwriteSchemasutrue. - Non è possibile specificare sia
partitionOverwriteModechereplaceWherenella stessa operazioneDataFrameWriter. - Se si specifica una
replaceWherecondizione usando un'opzioneDataFrameWriter, Delta Lake applica tale condizione per controllare quali dati vengono sovrascritti. Questa opzione ha la precedenza sullapartitionOverwriteModeconfigurazione a livello di sessione. - Verificare sempre che i dati scritti tocchino solo le partizioni previste. Una singola riga nella partizione errata può sovrascrivere involontariamente l'intera partizione.