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.
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_date
a következő adatokat replace_data
:
Python
(replace_data.write
.mode("overwrite")
.option("replaceWhere", "start_date >= '2017-01-01' AND end_date <= '2017-01-31'")
.table("events")
)
Scala
replace_data.write
.mode("overwrite")
.option("replaceWhere", "start_date >= '2017-01-01' AND end_date <= '2017-01-31'")
.table("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 date
a következő adatokat df
:
Python
(df.write
.mode("overwrite")
.option("replaceWhere", "birthDate >= '2017-01-01' AND birthDate <= '2017-01-31'")
.table("people10m")
)
Scala
df.write
.mode("overwrite")
.option("replaceWhere", "birthDate >= '2017-01-01' AND birthDate <= '2017-01-31'")
.table("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.partitionOverwriteMode
dynamic
beá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 partitionOverwriteMode
dynamic
beá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éntDataFrameWriter
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 areplaceWhere
munkamenet-konfigurációkat). - Hibaüzenet jelenik meg, ha a
DataFrameWriter
beállítások dinamikus partíciót írnak felül ésreplaceWhere
engedélyeznek.
- Ha a Dinamikus partíció felülírása engedélyezve van a Spark-munkamenet konfigurációjában, és
- A dinamikus partíció felülírása esetén nem adható meg
overwriteSchema
true
.