Adatok szelektív felülírása a Delta Lake használatával

A Delta Lake a következő különböző lehetőségeket kínálja a szelektív felülíráshoz:

  • A replaceWhere beállítás atomilag lecseréli az adott predikátumnak megfelelő összes rekordot.
  • A táblák partíciója alapján dinamikus partíció felülírással lecserélheti az adatkönyvtárakat.

A legtöbb művelet esetében a Databricks azt javasolja, hogy a replaceWhere segítségével adja meg, mely adatokat kell felülírni.

Important

Ha véletlenül felülírták az adatokat, a visszaállítással visszavonhatja a módosítást.

Tetszőleges szelektív felülírás a replaceWhere

Csak az tetszőleges kifejezésnek megfelelő adatokat írhatja felül szelektíven.

Note

Az SQL-hez a Databricks Runtime 12.2 LTS vagy újabb verziója szükséges.

Például cserélje le atomikusan a januári eseményeket a céltáblában, amelyet a rendszer particionált, a start_date-beli adatokkal.

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

Ez a mintakód kiírja az adatokat replace_data, ellenőrzi, hogy az összes sor megfelel-e a predikátumnak, és overwrite szemantika segítségével hajt végre atomi pótlást. Ha a művelet bármely értéke kívül esik a kényszeren, ez a művelet alapértelmezés szerint hibával meghiúsul.

Ezt a viselkedést a predikátumtartományon belüli értékekre overwrite és insert a megadott tartományon kívül eső rekordokra módosíthatja. Ehhez tiltsa le a kényszerellenőrzést úgy, hogy hamis értékre állítja spark.databricks.delta.replaceWhere.constraintCheck.enabled az alábbi beállítások egyikét:

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 boolean_expression bizonyos korlátozásokat elfogad. Lásd INSERT az SQL nyelvi referenciájában.

Örökölt viselkedés

Ha a régi viselkedést replaceWherehasználja, a lekérdezések felülírják a predikátumnak megfelelő adatokat csak partícióoszlopok felett. A következő parancs atomilag lecseréli a januári hónapot a céltáblában, amelyet a date particionált, a df adatainak felhasználásával.

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")

Az örökölt viselkedés használatához állítsa a spark.databricks.delta.replaceWhere.dataColumns.enabled zászlót a következőre: 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

Dinamikus partíció felülírása

A dinamikus partíció felülírása csak azokat a partíciókat frissíti, ahol az írás új adatokat véglegesít, és más partíciókat változatlanul hagy.

Azure Databricks a dinamikus partíciót felülíró REPLACE USING aktiválását javasolja. Ez a mód minden számítási típusban működik, beleértve a Databricks SQL Warehouse-t, a kiszolgáló nélküli számítást és a klasszikus számítást, és nem igényel Spark-munkamenet-konfigurációt. Lásd: Dinamikus partíció felülírása a következővel REPLACE USING: .

partitionOverwriteMode A dinamikus partíció felülírásának örökölt módja, amely megköveteli a klasszikus számítás használatát és a Spark-munkamenet konfigurálásának beállítását. Nem támogatott a Databricks SQL-ben vagy kiszolgáló nélküli számításban. Lásd a(z) dinamikus partíció felülírások (örökölt)partitionOverwriteMode elemet.

Az alábbi szakaszok bemutatják az egyes üzemmódok használatát.

Dinamikus partíció felülírása a következővel: REPLACE USING

A Databricks Runtime 16.3 és újabb verziók támogatják a dinamikus partíciófelülírást a táblákhoz.REPLACE USING Az összes számítási típus adatait szelektíven felülírhatja anélkül, hogy Spark-munkamenet-konfigurációt kellene beállítania. REPLACE USING lehetővé teszi a databricks SQL-tárolókon, kiszolgáló nélküli számításon és klasszikus számításon működő, számításfüggetlen, atomi felülírásos viselkedést.

REPLACE USING csak a bejövő adatok által megcélzott partíciókat írja felül. Az összes többi partíció változatlan marad.

REPLACE USING csak SQL-ben támogatott. További részletekért lásd INSERT az SQL nyelvi referenciájában.

Az alábbi példák a következőket használják REPLACE USING:

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

A dinamikus partíció felülírása esetén tartsa szem előtt az alábbi korlátozásokat és viselkedéseket:

  • A USING záradékban meg kell adnia a tábla partícióoszlopainak teljes készletét.
  • Mindig ellenőrizze, hogy az írott adatok csak a várt partíciókat érintik-e. A rossz partíció egyetlen sora véletlenül felülírhatja a teljes partíciót.

Ha jobban testre szabható egyező logikára van szüksége, mint amit REPLACE USING támogat, például az értékek egyenlőként való NULL kezelését, használja inkább a kiegészítőt REPLACE ON . Részletekért lásd a INSERT.

A dinamikus partíció felülírása a partitionOverwriteMode (örökölt) módszerrel történik.

Important

Ez a funkció nyilvános előzetes verzióban van.

A Databricks Runtime 11.3 LTS és újabb verziója támogatja a dinamikus partíció felülírását a particionált táblákhoz felülírási módban: SQL-ben INSERT OVERWRITE vagy DataFrame-írással df.write.mode("overwrite"). Ez a felülírástípus csak a klasszikus számításhoz érhető el, a Databricks SQL Warehouse-hoz és a kiszolgáló nélküli számításhoz nem.

Figyelmeztetés

Ha lehetséges, használja a INSERT OVERWRITE REPLACE USING-t a partíció felülírása helyett, amely magában foglalja a INSERT OVERWRITE PARTITION és spark.sql.sources.partitionOverwriteMode=dynamic elemeket. A partíciók módosításakor történő felülírás során elavult adatok kerülhetnek felhasználásra.

A dinamikus partíció felülírási módjának használatához állítsa a Spark-munkamenet konfigurációját spark.sql.sources.partitionOverwriteMode a következőre dynamic: . Alternatívaként beállíthatja a DataFrameWriter lehetőséget partitionOverwriteModedynamic. Ha van ilyen, a lekérdezésspecifikus beállítás felülírja a munkamenet-konfigurációban definiált módot. A spark.sql.sources.partitionOverwriteMode alapértelmezett értéke static.

Az alábbi példa partitionOverwriteModehasznál:

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")

Tartsa szem előtt a következő korlátozásokat és működési módokat partitionOverwriteMode:

  • A overwriteSchema nem állítható be true.
  • Nem adhatja meg mind a kettőt, partitionOverwriteMode és replaceWhere, egyazon DataFrameWriter műveletben.
  • Ha egy feltételt replaceWhere egy DataFrameWriter beállítással ad meg, a Delta Lake ezt a feltételt alkalmazza annak szabályozására, hogy mely adatokat írja felül a rendszer. Ez a beállítás elsőbbséget élvez a partitionOverwriteMode munkamenetszintű konfigurációval szemben.
  • Mindig ellenőrizze, hogy az írott adatok csak a várt partíciókat érintik-e. A rossz partíció egyetlen sora véletlenül felülírhatja a teljes partíciót.