Delta Lake ile verilerin üzerine seçmeli olarak yazma
Azure Databricks, seçmeli üzerine yazma işlemleri için iki farklı seçeneği desteklemek üzere Delta Lake işlevselliğinden yararlanmaktadır:
- seçeneği,
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.
Çoğu işlemde Databricks, hangi verilerin üzerine yazılacağını belirtmek için kullanılmasını replaceWhere
önerir.
Önemli
Verilerin üzerine yanlışlıkla yazıldıysa, geri yüklemeyi kullanarak değişikliği geri alabilirsiniz.
ile rastgele seçmeli üzerine yazma replaceWhere
Yalnızca rastgele bir ifadeyle eşleşen verilerin üzerine seçmeli olarak yazabilirsiniz.
Not
SQL için Databricks Runtime 12.2 LTS veya üzeri gerekir.
Aşağıdaki komut, tarafından bölümlenen start_date
hedef tablodaki Ocak ayındaki olayları atomik olarak içindeki replace_data
verilerle değiştirir:
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
Bu örnek kod içindeki replace_data
verileri yazar, tüm satırların koşulla eşleştiğini doğrular ve semantik kullanarak overwrite
atomik değiştirme 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ğerlere overwrite
ve insert
belirtilen aralığın dışında kalan kayıtlara değiştirebilirsiniz. Bunu yapmak için, aşağıdaki ayarlardan birini kullanarak false olarak ayarlayarak spark.databricks.delta.replaceWhere.constraintCheck.enabled
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
Eski davranış
Eski varsayılan davranış, yalnızca bölüm sütunlarına bir koşulla eşleşen verilerin üzerine yazmıştı replaceWhere
. Bu eski modelle, aşağıdaki komut tarafından bölümlenen date
hedef tablodaki Ocak ayını içindeki verilerle df
atomik olarak değiştirir:
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")
Eski davranışa geri dönmek istiyorsanız bayrağını spark.databricks.delta.replaceWhere.dataColumns.enabled
devre dışı bırakabilirsiniz:
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üm üzerine yazar
Önemli
Bu özellik Genel Önizlemededir.
Databricks Runtime 11.3 LTS ve üzeri, bölümlenmiş tablolar için dinamik bölüm üzerine yazma modunu destekler. Birden çok bölümü olan tablolar için Databricks Runtime 11.3 LTS ve altı yalnızca tüm bölüm sütunları aynı veri türündeyse dinamik bölüm üzerine yazmayı destekler.
Dinamik bölüm üzerine yazma modundayken işlemler, yazma işleminin yeni verileri işlediği her mantıksal bölümdeki tüm mevcut verilerin üzerine yazar. Yazma işleminin veri içermediği mevcut mantıksal bölümler değişmeden kalır. Bu mod yalnızca veriler üzerine yazma modunda yazıldığında geçerlidir: SQL'de INSERT OVERWRITE
veya ile df.write.mode("overwrite")
bir DataFrame yazma.
Spark oturum yapılandırmasını spark.sql.sources.partitionOverwriteMode
dynamic
olarak ayarlayarak dinamik bölüm üzerine yazma modunu yapılandırın. Seçeneğini olarak ayarlayarak DataFrameWriter
partitionOverwriteMode
dynamic
da bunu etkinleştirebilirsiniz. Varsa, sorguya özgü seçenek oturum yapılandırmasında tanımlanan modu geçersiz kılar. için partitionOverwriteMode
varsayılan değeridir static
.
Önemli
Dinamik bölüm üzerine yazma ile yazılan verilerin yalnızca beklenen bölümlere dokunduğunu doğrulayın. Yanlış bölümdeki tek bir satır istemeden tüm bölümün üzerine yazılmasını sağlayabilir.
Aşağıdaki örnek, dinamik bölüm üzerine yazmaları kullanmayı gösterir:
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")
Not
- Dinamik bölüm, bölümlenmiş tablolar seçeneğiyle
replaceWhere
çakışmaların üzerine yazar.- Spark oturumu yapılandırmasında dinamik bölüm üzerine yazma etkinse ve
replaceWhere
birDataFrameWriter
seçenek olarak sağlanırsa Delta Lake ifadeye göre verilerin üzerine yazar (sorguyareplaceWhere
özgü seçenekler oturum yapılandırmalarını geçersiz kılar). - Seçeneklerin
DataFrameWriter
hem dinamik bölüm üzerine yazmareplaceWhere
hem de etkin olması durumunda bir hata alırsınız.
- Spark oturumu yapılandırmasında dinamik bölüm üzerine yazma etkinse ve
- Dinamik bölüm üzerine yazma kullanılırken olarak
true
belirtemezsinizoverwriteSchema
.