Kommentar
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Delta Lake har följande distinkta alternativ för selektiva överskrivningar:
| Option | Användningsfall | Beräkningstyper som stöds | Minimiversion |
|---|---|---|---|
REPLACE WHERE |
Skriv över rader som matchar ett predikat atomiskt. Används för ersättningar med ett fast matchningsvillkor, till exempel colA = 5 eller int_col IN (1, 2, 3). |
Alla beräkningstyper. | SQL i Databricks Runtime 12.2 LTS och senare. Python och Scala i Databricks Runtime 9.1 LTS och senare. |
REPLACE USING |
Dynamisk överskrivning av data Ersätter alla rader som matchar de angivna kolumnerna, baserat på likhetsjämförelse av kolumnvärdena, i den angivna datauppsättningen. | Alla beräkningstyper. | SQL i Databricks Runtime 16.3 och senare. Python och Scala i Databricks Runtime 18.2 och senare. |
REPLACE ON |
Dynamisk dataöverskrivning efter booleskt uttryck. Använd för ersättningar med ett komplext eller NULL-säkert matchningsvillkor, till exempel s.colA <=> t.colA AND s.colB <=> t.colB. |
Alla beräkningstyper. | SQL i Databricks Runtime 17.1 och senare. Python och Scala i Databricks Runtime 18.2 och senare. |
partitionOverwriteMode |
Äldre dynamisk överskrivning av partitioner, som skriver över all befintlig data i varje partition som skrivningen ska skriva nya data till. Rekommenderas inte för nya arbetsbelastningar. | SQL stöder endast klassisk beräkning. Python och Scala stöder alla beräkningstyper. | SQL, Python och Scala i Databricks Runtime 11.3 LTS och senare. |
För de flesta användningsfall rekommenderar Databricks att du använder REPLACE USING eller REPLACE WHERE. Använd REPLACE ON endast om ditt användningsfall kräver komplexa eller NULL-säkra matchningsvillkor.
Mer information om varje alternativs ersättningsbeteende finns i INSERT. En fullständig lista över DataFrameWriter Alternativ för Delta Lake finns i Delta Lake och Apache Iceberg.
I Scala och Python kan replaceOn och replaceUsing inte användas i kombination med replaceWhere, partitionOverwriteMode eller overwriteSchema.
Vid tomma källfrågor tar varken REPLACE USING eller REPLACE ON bort data, men REPLACE WHERE kan ta bort data.
Important
Om data har skrivits över av misstag kan du använda återställa för att ångra ändringen.
REPLACE WHERE
Du kan selektivt skriva över endast de data som matchar ett godtyckligt uttryck med REPLACE WHERE.
Important
Om du vill dra nytta av inkrementell uppdatering när du kör REPLACE WHERE, använd REPLACE WHERE-flöden i Spark Declarative Pipelines (SDP). Se batchbearbetning med REPLACE WHERE-flöden.
För att atomiskt ersätta händelser i januari i måltabellen, som partitioneras av start_date, med data i 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
Den här exempelkoden skriver ut data i replace_data, verifierar att alla rader matchar predikatet och utför en atomisk ersättning med hjälp av overwrite semantik. Om några värden i åtgärden ligger utanför predikatet misslyckas den här åtgärden med ett fel som standard.
I klassisk beräkning, om du vill ändra det här beteendet till overwrite värden inom predikatintervallet och insert poster utanför det angivna intervallet, tar du bort begränsningskontrollen genom att ange spark.databricks.delta.replaceWhere.constraintCheck.enabled till false:
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 accepterar en boolean_expression med vissa begränsningar. Se INSERT i språkreferensen för SQL.
För tomma källfrågor REPLACE WHERE kan du ta bort tabellrader.
Äldre beteende
Äldre replaceWhere är endast tillgängligt för klassisk beräkning. Se Översikt över klassisk beräkning.
Om du använder det äldre beteendet replaceWhere, skriver frågor över data som endast matchar ett predikat över partitionskolumner. Följande kommando skulle atomiskt ersätta januari månad i måltabellen, som partitioneras av date, med data i 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")
Om du vill använda äldre beteende anger du spark.databricks.delta.replaceWhere.dataColumns.enabled till 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
Dynamiska dataöverskrivningar
Dynamiska dataöverskrivningar ersätter selektivt data som matchar de angivna nyckelkolumnerna eller det booleska uttrycket, medan alla andra data förblir oförändrade. Partitionerade tabeller, opartitionerade tabeller och tabeller med flytande klustring stöds alla.
Dynamisk partitionsöverskrivning är en delmängd av beteendet för dynamisk dataöverskrivning. Dynamisk överskrivning av partitioner ersätter all befintlig data i varje partition där skrivningen kommer att skriva nya data och lämnar alla andra partitioner oförändrade. Endast partitionerade tabeller stöds.
REPLACE USING
SQL stöds i Databricks Runtime 16.3 och senare. Python och Scala stöds i Databricks Runtime 18.2 och senare. Mer information om beteendeskillnader mellan Databricks Runtime 16.3 och 17.1 finns i Legacy behavior.
REPLACE USING aktiverar beräkningsoberoende, atomisk överskrivningsbeteende som fungerar på Databricks SQL-lager, serverlös beräkning och klassisk beräkning.
REPLACE USING kräver inte att du ställer in en Spark-sessionskonfiguration.
REPLACE USING ersätter rader när de angivna kolumnerna anses lika vid likhetsjämförelse. Alla andra data förblir oförändrade.
Använd dynamisk dataöverskrivning med REPLACE USING:
Python
(sourceDataDF.write
.mode("overwrite")
.option("replaceUsing", "event_id, start_date")
.saveAsTable("events")
)
Scala
sourceDataDF.write
.mode("overwrite")
.option("replaceUsing", "event_id, start_date")
.saveAsTable("events")
SQL
INSERT INTO TABLE events
REPLACE USING (event_id, start_date)
SELECT * FROM source_data
För tomma källfrågor REPLACE USING tar du inte bort några tabellrader.
Använd i stället för komplexa eller NULL-säkra matchningsvillkor REPLACE ON . Se även REPLACE ON.
Se INSERT i språkreferensen för SQL.
Äldre beteende
I Databricks Runtime 16.3 till 17.1 REPLACE USING använder äldre beteende och tillåter endast dynamisk partitionsöverskrivning, medan Databricks Runtime 17.2 och senare tillåter dynamiska dataöverskrivningar.
Tänk på följande begränsningar och beteenden för det äldre beteendet i REPLACE USING:
- Du måste ange den fullständiga uppsättningen av tabellens partitionskolumner i
USING-satsen. - Kontrollera alltid att de data som skrivs endast berör de förväntade partitionerna. En enskild rad i fel partition kan oavsiktligt skriva över hela partitionen.
REPLACE ON
SQL stöds i Databricks Runtime 17.1 och senare. Python och Scala stöds i Databricks Runtime 18.2 och senare.
REPLACE ON ersätter rader när de matchar ett användardefinierat villkor, till skillnad från REPLACE USING, som ersätter rader när de angivna kolumnerna jämför lika under likhet. Använd REPLACE ON när du behöver matchande logik som REPLACE USING inte stöder, till exempel att behandla NULL värden som lika.
Du kan också använda targetAlias alternativet för att ange ett alias för måltabellen och API:erna .as() eller .alias() för att ange ett alias för källdata.
Sql-syntax finns i INSERT.
Python
(sourceDataDF.alias("s")
.write
.mode("overwrite")
.option("targetAlias", "t")
.option("replaceOn", "s.event_id <=> t.event_id AND s.start_date <=> t.start_date")
.saveAsTable("events")
)
Scala
sourceDataDF.as("s")
.write
.mode("overwrite")
.option("targetAlias", "t")
.option("replaceOn", "s.event_id <=> t.event_id AND s.start_date <=> t.start_date")
.saveAsTable("events")
SQL
INSERT INTO TABLE events AS t
REPLACE ON (s.event_id <=> t.event_id AND s.start_date <=> t.start_date)
(SELECT * FROM source_data) AS s
För tomma källfrågor REPLACE ON tar du inte bort några tabellrader.
Dynamisk partition skriver över med partitionOverwriteMode (äldre)
Important
Den här funktionen finns som allmänt tillgänglig förhandsversion.
Databricks Runtime 11.3 LTS och senare stöder dynamisk partitionsöverskrivning för partitionerade tabeller med överskrivningsläge: antingen INSERT OVERWRITE i SQL eller en DataFrame-skrivning med df.write.mode("overwrite"). Den här typen av överskrivning är endast tillgänglig för klassisk beräkning, inte Databricks SQL-lager eller serverlös beräkning.
Varning
När det är möjligt använder du INSERT REPLACE USING i stället för partitionsöverskrivning INSERT OVERWRITE PARTITION och spark.sql.sources.partitionOverwriteMode=dynamic. Överskrivning av partition kan använda inaktuella data när partitionering ändras.
Om du vill använda läget för dynamisk partitionsöverskrivning anger du Spark-sessionskonfigurationen spark.sql.sources.partitionOverwriteMode till dynamic. Du kan också ange DataFrameWriter alternativet partitionOverwriteMode till dynamic. Om det finns, åsidosätter det frågespecifika alternativet det läge som är definierat i sessionskonfigurationen. Standardvärdet för spark.sql.sources.partitionOverwriteMode är static.
I följande exempel används 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")
Tänk på följande begränsningar och beteenden för partitionOverwriteMode:
- Du kan inte ange
overwriteSchematilltrue. - Du kan inte ange både
partitionOverwriteModeochreplaceWherei sammaDataFrameWriteråtgärd. - Om du anger ett
replaceWherevillkor med ettDataFrameWriteralternativ tillämpar Delta Lake det villkoret för att styra vilka data som skrivs över. Det här alternativet har företräde framför konfigurationen påpartitionOverwriteModesessionsnivå. - Kontrollera alltid att de data som skrivs endast berör de förväntade partitionerna. En enskild rad i fel partition kan oavsiktligt skriva över hela partitionen.