Skriv över data selektivt med Delta Lake

Delta Lake har följande distinkta alternativ för selektiva överskrivningar:

  • Alternativet replaceWhere ersätter atomiskt alla poster som matchar ett angivet predikat.
  • Du kan ersätta kataloger med data baserat på hur tabeller partitioneras med dynamiska partitionsöverskrivningar.

För de flesta åtgärder rekommenderar Databricks att du använder replaceWhere för att ange vilka data som ska skrivas över.

Important

Om data har skrivits över av misstag kan du använda återställa för att ångra ändringen.

Godtycklig selektiv överskrivning med replaceWhere

Du kan selektivt skriva över endast de data som matchar ett godtyckligt uttryck.

Note

SQL kräver Databricks Runtime 12.2 LTS eller senare.

Du kan till exempel 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 villkoret misslyckas den här åtgärden med ett fel som standard.

Du kan ändra det här beteendet till overwrite värden inom villkorsintervallet och insert poster som ligger utanför det angivna intervallet. Om du vill göra det inaktiverar du begränsningskontrollen genom att ange spark.databricks.delta.replaceWhere.constraintCheck.enabled till false med någon av följande inställningar:

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.

Äldre beteende

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 flaggan 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

Dynamisk partitionsöverskrivning

Dynamisk partitionsöverskrivning uppdaterar endast de partitioner där nya data skrivs och lämnar andra partitioner oförändrade.

Azure Databricks rekommenderar REPLACE USING för att utlösa dynamisk partitionsöverskrivning. Det här läget fungerar för alla beräkningstyper, inklusive Databricks SQL-lager, serverlös beräkning och klassisk beräkning, och kräver inte att du ställer in en Spark-sessionskonfiguration. Se Dynamisk partitionsöverskrivning med REPLACE USING.

partitionOverwriteMode är ett äldre läge för dynamisk partitionsöverskrivning som kräver att du använder klassisk beräkning och anger en Spark-sessionskonfiguration. Det stöds inte på Databricks SQL eller serverlös beräkning. Se Dynamisk partitionsöverskrivning med partitionOverwriteMode (äldre).

Avsnitten nedan visar hur du använder varje läge.

Dynamisk partitionsöverskrivning med REPLACE USING

Databricks Runtime 16.3 och senare stöder dynamisk partitionsöverskrivning för tabeller med .REPLACE USING Du kan selektivt skriva över data över alla beräkningstyper, utan att behöva ange en Spark-sessionskonfiguration. REPLACE USING aktiverar beräkningsoberoende, atomisk överskrivningsbeteende som fungerar på Databricks SQL-lager, serverlös beräkning och klassisk beräkning.

REPLACE USING skriver bara över de partitioner som inkommande data riktar in sig på. Alla andra partitioner förblir oförändrade.

REPLACE USING stöds endast i SQL. Mer information finns INSERT i sql-språkreferensen.

Följande exempel använder REPLACE USING:

INSERT INTO TABLE events
  REPLACE USING (event_id, start_date)
  SELECT * FROM source_data

Tänk på följande begränsningar och beteenden för dynamiska partitionsöverskrivningar:

  • 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.

Om du behöver mer anpassningsbar matchningslogik än vad REPLACE USING som stöds, till exempel att behandla NULL värden som lika, använder du kompletterande REPLACE ON i stället. Se INSERT för mer information.

Dynamisk partitionsöverskrivning 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 overwriteSchema till true.
  • Du kan inte ange både partitionOverwriteMode och replaceWhere i samma DataFrameWriter åtgärd.
  • Om du anger ett replaceWhere villkor med ett DataFrameWriter alternativ 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å partitionOverwriteMode sessionsnivå.
  • 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.