Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Delta Lake, seçmeli üzerine yazma işlemleri için aşağıdaki farklı seçeneklere sahiptir:
- Seçenek
replaceWhere, belirli bir koşulla eşleşen tüm kayıtları atomik olarak değiştirir. - Dinamik bölüm üzerine yazma işlemleri kullanarak tabloların nasıl bölümlendiğine bağlı olarak veri dizinlerini değiştirebilirsiniz.
Databricks, çoğu işlem için üzerine yazılacak verileri belirtmek amacıyla replaceWhere kullanmanızı önerir.
Important
Veri yanlışlıkla üzerine yazıldıysa, değişikliği geri almak için geri yükleme kullanabilirsiniz.
Rastgele seçmeli üzerine yazma işlemi replaceWhere
Yalnızca rastgele bir ifadeyle eşleşen verilerin üzerine seçmeli olarak yazabilirsiniz.
Note
SQL için Databricks Runtime 12.2 LTS veya üzeri gerekir.
Örneğin, start_date ile bölümlenmiş hedef tablodaki Ocak ayındaki olayları verilerdeki replace_data ile atomik olarak değiştirin.
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
Bu örnek kod replace_data verilerini yazar, tüm satırların predikata uyduğunu doğrular ve semantik kurallarını kullanarak overwrite ile atomik değişiklik gerçekleştirir. İşlemdeki herhangi bir değer kısıtlamanın dışında kalırsa, bu işlem varsayılan olarak bir hatayla başarısız olur.
Bu davranışı koşul aralığındaki değerleri overwrite ve belirtilen aralığın dışında kalan kayıtları insert olarak değiştirebilirsiniz. Bunu yapmak için, aşağıdaki ayarlardan birini kullanarak spark.databricks.delta.replaceWhere.constraintCheck.enabled false olarak ayarlayarak kısıtlama denetimini devre dışı bırakın:
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 bazı kısıtlamalarla a boolean_expression kabul eder. Bkz INSERT . SQL dili referansına.
Mirastan kalan davranış
eski davranışını replaceWherekullanırsanız, sorgular yalnızca bölüm sütunları üzerindeki bir koşulla eşleşen verilerin üzerine yazar. Aşağıdaki komut, date tarafından bölümlenen hedef tablodaki Ocak ayını df içindeki verilerle atomik olarak değiştirir:
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")
Eski davranışı kullanmak için bayrağını spark.databricks.delta.replaceWhere.dataColumns.enabled olarak falseayarlayın:
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
Dinamik Bölümlerin Üzerine Yazılması
Dinamik bölüm üzerine yazma yalnızca yazma işleminin yeni verileri işlediği ve diğer bölümleri değişmeden bıraktığı bölümleri güncelleştirir.
Azure Databricks, dinamik bölüm üzerine yazmaları tetiklemek için REPLACE USING önerir. Bu mod Databricks SQL ambarları, sunucusuz işlem ve klasik işlem dahil olmak üzere tüm işlem türlerinde çalışır ve Spark oturumu yapılandırması ayarlamanız gerekmez. Bkz. REPLACE USING ile dinamik bölüm üzerine yazmalar.
partitionOverwriteMode , klasik işlem kullanmanızı ve Spark oturumu yapılandırması ayarlamanızı gerektiren dinamik bölüm üzerine yazma işlemleri için eski bir moddur. Databricks SQL veya sunucusuz işlemde desteklenmez. Bkz . Dinamik bölüm (eski) ile partitionOverwriteMode üzerine yazılır.
Aşağıdaki bölümlerde her modun nasıl kullanılacağı gösterilmektedir.
Dinamik bölüm üzerine yazma işlemi REPLACE USING
Databricks Runtime 16.3 ve üzeri, REPLACE USING kullanan tablolar için dinamik bölüm üzerine yazmayı destekler. Spark oturum yapılandırması ayarlamanıza gerek kalmadan tüm işlem türleri genelinde verilerin üzerine seçmeli olarak yazabilirsiniz.
REPLACE USING Databricks SQL ambarlarında, sunucusuz hesaplamada ve klasik hesaplamada çalışan hesaplama bağımsız, atomik üzerine yazma davranışını etkinleştirir.
REPLACE USING yalnızca gelen verilerin hedeflediği bölümlerin üzerine yazar. Diğer tüm bölümler değişmeden kalır.
REPLACE USING yalnızca SQL'de desteklenir. SQL dil başvurusunda, ayrıntılar için bkz INSERT.
Aşağıdaki örneklerde kullanılır REPLACE USING:
INSERT INTO TABLE events
REPLACE USING (event_id, start_date)
SELECT * FROM source_data
Dinamik bölüm üzerine yazma işlemleri için aşağıdaki kısıtlamaları ve davranışları göz önünde bulundurun:
-
USINGifadesinde tablonun bölüm sütunlarının tam kümesini belirtmeniz gerekir. - Yazılan verilerin yalnızca beklenen bölümlere dokunduğunu her zaman doğrulayın. Yanlış bir bölüme ait tek bir satır, istemeden tüm bölümün üzerine yazılmasına neden olabilir.
Değerleri eşit olarak ele alma REPLACE USING gibi desteklenenden NULL daha fazla özelleştirilebilir eşleştirme mantığına ihtiyacınız varsa, bunun yerine tamamlayıcıyı REPLACE ON kullanın. Ayrıntılar için bkz INSERT .
(eski) ile partitionOverwriteMode dinamik bölüm üzerine yazılır
Important
Bu özellik Genel Önizleme aşamasındadır.
Databricks Runtime 11.3 LTS ve üzeri, SQL'de INSERT OVERWRITE veya df.write.mode("overwrite") ile bir DataFrame yazma kullanarak bölümlenmiş tablolar için dinamik bölüm üzerine yazmayı destekler. Bu tür bir üzerine yazma yalnızca klasik işlem için kullanılabilir; Databricks SQL ambarları veya sunucusuz işlem için kullanılamaz.
Uyarı
Mümkün olduğunda, bölüm üzerine yazma işlemi INSERT REPLACE USING ve INSERT OVERWRITE PARTITION yerine spark.sql.sources.partitionOverwriteMode=dynamic kullanmayı tercih edin. Bölüm üzerine yazma işlemi, bölümlendirme değişiklikleri sırasında eski verileri kullanabilir.
Dinamik bölüm üzerine yazma modunu kullanmak için Spark oturumu yapılandırmasını spark.sql.sources.partitionOverwriteMode olarak dynamicayarlayın. Alternatif olarak, DataFrameWriter seçeneğini partitionOverwriteMode, dynamic olarak ayarlayabilirsiniz. Varsa, sorguya özgü seçenek oturum yapılandırmasında tanımlanan modu geçersiz kılar.
spark.sql.sources.partitionOverwriteMode için varsayılan değer staticdeğeridir.
Aşağıdaki örnekte partitionOverwriteModekullanılır:
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")
için partitionOverwriteModeaşağıdaki kısıtlamaları ve davranışları göz önünde bulundurun:
-
overwriteSchemaöğesinitrueolarak ayarlayamazsınız. - Aynı
partitionOverwriteModeişleminde hemreplaceWherehem deDataFrameWriterbelirtemezsiniz. -
replaceWhereseçeneği kullanarak birDataFrameWriterkoşul belirtirseniz, Delta Lake hangi verilerin üzerine yazılacağını kontrol etmek için bu koşulu uygular. Bu seçenek oturum düzeyi yapılandırmasındanpartitionOverwriteModeönceliklidir. - Yazılan verilerin yalnızca beklenen bölümlere dokunduğunu her zaman doğrulayın. Yanlış bir bölüme ait tek bir satır, istemeden tüm bölümün üzerine yazılmasına neden olabilir.