Aracılığıyla paylaş


Delta Lake ile verileri seçici bir şekilde üzerine yazma

Azure Databricks, seçmeli üzerine yazma işlemleri için aşağıdaki farklı seçenekleri desteklemek üzere Delta Lake işlevselliğinden yararlanmaktadır:

  • 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 varsayılan davranış, yalnızca bölüm sütunlarına göre bir koşulla eşleşen verilerin üzerine replaceWhere'nin verileri yazmasıydı. Bu eski modelle, aşağıdaki komut, dateile bölümlenmiş hedef tablodaki Ocak ayını, dfiç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ış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ümlerin Üzerine Yazılması

Dinamik bölüm üzerine yazma yalnızca yazma işleminin yeni verileri işlediği bölümleri güncelleştirir. Bu bölümlerdeki tüm mevcut verilerin üzerine yazar ve diğer bölümlerin değişmeden kalmasını sağlar.

Azure Databricks iki yaklaşımı destekler:

  • REPLACE USING (önerilir) - Databricks SQL ambarları, sunucusuz işlem ve klasik işlem dahil olmak üzere tüm işlem türlerinde çalışır. Spark oturumu yapılandırması ayarlanması gerekmez.
  • partitionOverwriteMode (eski) - Klasik işlemler ve Spark oturumu yapılandırmasını gerektirir. Databricks SQL veya sunucusuz işlemde desteklenmez.

Aşağıdaki bölümlerde her yaklaşımın nasıl kullanılacağı gösterilmektedir.

Dinamik bölüm üzerine yazma işlemi REPLACE USING

Databricks Runtime 16.3 ve üzeri, REPLACE USING kullanarak bölümlenmiş tablolar için dinamik bölüm üzerine yazmaları destekler. Bu yöntem, Spark oturum yapılandırması ayarlamanıza gerek kalmadan tüm işlem türlerinde verilerin üzerine seçmeli olarak yazmanızı sağlar. 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.

Aşağıdaki örnek, REPLACE USING ile dinamik bölüm üzerine yazma işleminin nasıl kullanılacağını göstermektedir. Şu anda Python veya Scala'yı değil yalnızca SQL'i kullanabilirsiniz. SQL dil başvurusunda, ayrıntılar için bkz INSERT.

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:

  • USING ifadesinde 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 OVERWRITE 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.

Spark oturumu yapılandırmasını spark.sql.sources.partitionOverwriteMode'dan dynamic'e ayarlayarak dinamik bölüm üzerine yazma modunu etkinleştirin. 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. için spark.sql.sources.partitionOverwriteMode varsayılan değeridir static.

Aşağıdaki örnekte kullanımı partitionOverwriteModegösterilmektedir:

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 öğesini true olarak ayarlayamazsınız.
  • Aynı partitionOverwriteMode işleminde hem replaceWhere hem de DataFrameWriter belirtemezsiniz.
  • replaceWhere seçeneği kullanarak bir DataFrameWriter koş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ından partitionOverwriteMode ö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.