Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
A Delta Lake a következő különböző lehetőségeket kínálja a szelektív felülíráshoz:
- A
replaceWherebeá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
USINGzá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
overwriteSchemanem állítható betrue. - Nem adhatja meg mind a kettőt,
partitionOverwriteModeésreplaceWhere, egyazonDataFrameWriterműveletben. - Ha egy feltételt
replaceWhereegyDataFrameWriterbeá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 apartitionOverwriteModemunkamenetszintű 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.