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. Bu özellik Databricks Runtime 9.1 LTS ve üzeri dataframe'lerde kullanılabilir ve Databricks Runtime 12.0 (desteklenmeyen) ve üzeri sürümlerin SQL'de desteklenir.

Aşağıdaki komut, tarafından bölümlenen start_datehedef tablodaki Ocak ayındaki olayları atomik olarak içindeki replace_dataverilerle değiştirir:

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

Bu örnek kod içindeki replace_dataverileri 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

Databricks Runtime 9.0 ve altında, replaceWhere yalnızca bölüm sütunları üzerinde bir koşulla eşleşen verilerin üzerine yazar. Aşağıdaki komut, tarafından bölümlenen datehedef tablodaki Ocak ayını atomik olarak içindeki dfverilerle değiştirir:

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

Databricks Runtime 9.1 ve üzerinde, eski davranışa geri dönmek istiyorsanız bayrağı devre spark.databricks.delta.replaceWhere.dataColumns.enabled 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.1 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 12.0 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.partitionOverwriteModedynamicolarak ayarlayarak dinamik bölüm üzerine yazma modunu yapılandırın. Seçeneğini olarak ayarlayarak DataFrameWriterpartitionOverwriteModedynamicda 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")

Dekont

  • 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 bir DataFrameWriter seçenek olarak sağlanırsa Delta Lake ifadeye göre verilerin üzerine yazar (sorguya replaceWhere özgü seçenekler oturum yapılandırmalarını geçersiz kılar).
    • Seçeneklerin DataFrameWriter hem dinamik bölüm üzerine yazma replaceWhere hem de etkin olması durumunda bir hata alırsınız.
  • Dinamik bölüm üzerine yazma kullanılırken olarak true belirtemezsinizoverwriteSchema.