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

Az Azure Databricks a Delta Lake funkcióit használja a szelektív felülírások két különböző lehetőségének támogatásához:

  • A replaceWhere beállítás atomilag lecseréli az adott predikátumnak megfelelő összes rekordot.
  • A táblák dinamikus partíciót felülíró particionálási módjától függően lecserélheti az adatkönyvtárakat.

A legtöbb művelet esetében a Databricks replaceWhere azt javasolja, hogy adja meg, mely adatokat írja felül.

Fontos

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.

Feljegyzés

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

Az alábbi parancs atomilag lecseréli a januári eseményeket a céltáblában, amely particionálta start_datea következő adatokat replace_data:

Python

(replace_data.write
  .mode("overwrite")
  .option("replaceWhere", "start_date >= '2017-01-01' AND end_date <= '2017-01-31'")
  .save("/tmp/delta/events")
)

Scala

replace_data.write
  .mode("overwrite")
  .option("replaceWhere", "start_date >= '2017-01-01' AND end_date <= '2017-01-31'")
  .save("/tmp/delta/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 beírja az adatokat replace_data, ellenőrzi, hogy az összes sor megfelel-e a predikátumnak, és szemantikával overwrite végez-e 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

Örökölt viselkedés

Az örökölt alapértelmezett viselkedés felülírta replaceWhere a predikátumnak megfelelő adatokat csak a partícióoszlopok felett. Ezzel az örökölt modellel a következő parancs atomi módon lecseréli a januári hónapot a céltáblában, amely particionálta datea következő adatokat df:

Python

(df.write
  .mode("overwrite")
  .option("replaceWhere", "birthDate >= '2017-01-01' AND birthDate <= '2017-01-31'")
  .save("/tmp/delta/people10m")
)

Scala

df.write
  .mode("overwrite")
  .option("replaceWhere", "birthDate >= '2017-01-01' AND birthDate <= '2017-01-31'")
  .save("/tmp/delta/people10m")

Ha vissza szeretne esni a régi viselkedésre, letilthatja a jelzőt spark.databricks.delta.replaceWhere.dataColumns.enabled :

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

Fontos

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

A Databricks Runtime 11.3 LTS és újabb verziója támogatja a particionált táblák dinamikus partíciót felülíró módját. Több partícióval rendelkező táblák esetén a Databricks Runtime 11.3 LTS és az alábbi verziók csak akkor támogatják a dinamikus partíció felülírását, ha az összes partícióoszlop azonos adattípusú.

Ha dinamikus partíciót ír felül, a műveletek felülírják az összes meglévő adatot minden olyan logikai partíción, amelyhez az írás új adatokat véglegesít. A meglévő logikai partíciók, amelyek írása nem tartalmaz adatokat, változatlanok maradnak. Ez a mód csak akkor alkalmazható, ha az adatok felülírási módban vannak megírva: INSERT OVERWRITE SQL-ben vagy DataFrame-írással df.write.mode("overwrite").

A Spark-munkamenet konfigurációjának spark.sql.sources.partitionOverwriteModedynamicbeállításával konfigurálja a dinamikus partíció felülírási módját. Ezt a beállítást a beállítás partitionOverwriteModedynamicbeállításával DataFrameWriter is engedélyezheti. Ha van ilyen, a lekérdezésspecifikus beállítás felülírja a munkamenet-konfigurációban definiált módot. Az alapértelmezett érték a partitionOverwriteMode következő static: .

Fontos

Ellenőrizze, hogy a dinamikus partícióval írt adatok felülírják-e a várt partíciókat. A helytelen partíció egyetlen sora véletlenül felülírhat egy teljes partíciót.

Az alábbi példa a dinamikus partíció felülírásait mutatja be:

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

Feljegyzés

  • A dinamikus partíció felülírja a particionált táblák beállításával replaceWhere való ütközéseket.
    • Ha a Dinamikus partíció felülírása engedélyezve van a Spark-munkamenet konfigurációjában, és replaceWhere lehetőségként DataFrameWriter van megadva, akkor a Delta Lake felülírja az adatokat a kifejezésnek megfelelően (a lekérdezésspecifikus beállítások felülbírálják a replaceWhere munkamenet-konfigurációkat).
    • Hibaüzenet jelenik meg, ha a DataFrameWriter beállítások dinamikus partíciót írnak felül és replaceWhere engedélyeznek.
  • A dinamikus partíció felülírása esetén nem adható meg overwriteSchematrue .