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

Delta Lake, seçmeli üzerine yazma işlemleri için aşağıdaki farklı seçeneklere sahiptir:

Seçenek Kullanım örneği Desteklenen işlem türleri En düşük sürüm
REPLACE WHERE Bir koşulla eşleşen satırların üzerine atomik olarak yazın. colA = 5 veya int_col IN (1, 2, 3) gibi sabit bir eşleşme koşuluna sahip değiştirmeler için kullanın. Tüm işlem türleri. Databricks Runtime 12.2 LTS ve üzerindeki SQL. Databricks Runtime 9.1 LTS ve üzeri sürümlerde Python ve Scala.
REPLACE USING Dinamik verilerin üzerine yazma. Belirtilen sütunlarla eşleşen tüm satırları, sağlanan veri kümesindeki sütun değerlerinin eşitlik karşılaştırması temelinde değiştirir. Tüm işlem türleri. Databricks Runtime 16.3 ve sonraki sürümlerde SQL. Databricks Runtime 18.2 ve üzeri sürümlerde Python ve Scala.
REPLACE ON Boolean ifadesiyle dinamik verinin üzerine yazılması. s.colA <=> t.colA AND s.colB <=> t.colB gibi karmaşık veya NULL güvenli bir eşleştirme koşuluna sahip değiştirmeler için kullanın. Tüm işlem türleri. Databricks Runtime 17.1 ve üzeri sürümlerde SQL. Databricks Runtime 18.2 ve sonraki sürümlerde Python ve Scala.
partitionOverwriteMode Eski dinamik bölümün üzerine yazma; bu işlem, yazma işleminin yeni veri kaydedeceği her bölümdeki mevcut verilerin tümünün üzerine yazar. Yeni iş yükleri için önerilmez. SQL yalnızca klasik işlem destekler. Python ve Scala tüm işlem türlerini destekler. Databricks Runtime 11.3 LTS ve üzeri sürümlerde SQL, Python ve Scala.

Databricks, çoğu kullanım senaryosu için REPLACE USING veya REPLACE WHERE kullanılmasını önerir. Yalnızca kullanım örneğiniz karmaşık veya NULL güvenli eşleştirme koşulları gerektiriyorsa kullanın REPLACE ON .

Her seçeneğin değiştirme davranışı hakkında ayrıntılı bilgi için bkz INSERT. . Delta Lake seçeneklerinin DataFrameWriter tam listesi için bkz. Delta Lake ve Apache Iceberg.

Scala ve Python'da replaceOn ve replaceUsingreplaceWhere, partitionOverwriteMode veya overwriteSchema ile birlikte kullanılamaz.

Boş kaynak sorguları için, hem REPLACE USING hem de REPLACE ON verileri silmez; ancak REPLACE WHERE verileri silebilir.

Important

Veri yanlışlıkla üzerine yazıldıysa, değişikliği geri almak için geri yükleme kullanabilirsiniz.

REPLACE WHERE

REPLACE WHERE ile, yalnızca herhangi bir ifadeyle eşleşen verilerin üzerine seçerek yazabilirsiniz.

Important

REPLACE WHERE çalıştırırken artımlı yenilemeden yararlanmak için Spark Declarative Pipelines (SDP) içinde REPLACE WHERE akışlarını kullanın. Bkz. REPLACE WHERE akışlarıyla toplu işleme.

start_date ile bölümlenmiş hedef tablodaki Ocak ayı olaylarını, replace_data içindeki verilerle atomik olarak değiştirmek için:

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 koşul dışında kalırsa, bu işlem varsayılan olarak bir hatayla başarısız olur.

Klasik işlem ortamında, bu davranışı koşul aralığındaki değerler için overwrite ve belirtilen aralığın dışındaki kayıtlar için insert olarak değiştirmek üzere, spark.databricks.delta.replaceWhere.constraintCheck.enabled değerini false olarak ayarlayarak kısıtlama denetimini kaldırı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.

Boş kaynak sorgular için REPLACE WHERE tablo satırlarını silebilir.

Mirastan kalan davranış

Legacy replaceWhere yalnızca klasik işlem altyapısında kullanılabilir. Bkz. Klasik işlem genel bakış.

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 spark.databricks.delta.replaceWhere.dataColumns.enabled değerini false olarak ayarlayı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 verilerin üzerine yazma

Dinamik veri üzerine yazma işlemleri, belirtilen anahtar sütunlarla veya Boole ifadesiyle eşleşen verileri seçmeli olarak değiştirir ve diğer tüm verileri olduğu gibi bırakır. Bölümlenmiş tablolar, bölümlenmemiş tablolar ve sıvı kümeleme içeren tabloların tümü desteklenir.

Dinamik bölüm üzerine yazma işlemleri, dinamik verilerin üzerine yazma davranışının bir alt kümesidir. Dinamik bölüm üzerine yazma işlemleri, yazma işleminin yeni verileri işlediği ve diğer tüm bölümleri değişmeden bıraktığı her bölümdeki tüm mevcut verilerin yerini alır. Yalnızca bölümlenmiş tablolar desteklenir.

REPLACE USING

Sql, Databricks Runtime 16.3 ve üzerinde desteklenir. Python ve Scala, Databricks Runtime 18.2 ve üzeri sürümlerde desteklenir. Databricks Runtime 16.3 ile 17.1 arasındaki davranış farklılıkları için bkz. Eski davranış.

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 Spark oturum yapılandırması ayarlamanız gerekmez.

REPLACE USING belirtilen sütunlar eşit olarak karşılaştırıldığında satırları değiştirir. Diğer tüm veriler değişmeden kalır.

REPLACE USING ile dinamik veri üzerine yazma özelliğini kullanın:

Python

(sourceDataDF.write
  .mode("overwrite")
  .option("replaceUsing", "event_id, start_date")
  .saveAsTable("events")
)

Scala

sourceDataDF.write
  .mode("overwrite")
  .option("replaceUsing", "event_id, start_date")
  .saveAsTable("events")

SQL

INSERT INTO TABLE events
  REPLACE USING (event_id, start_date)
  SELECT * FROM source_data

Kaynak sorguları boş olduğunda, REPLACE USING hiçbir tablo satırını silmez.

Karmaşık veya NULL güvenli eşleştirme koşulları için bunun yerine kullanın REPLACE ON . Bkz. REPLACE ON.

Bkz INSERT . SQL dili referansına.

Eski davranış

Databricks Runtime 16.3 ile 17.1 REPLACE USING arasında eski davranışı kullanır ve yalnızca dinamik bölüm üzerine yazma işlemlerine izin verirken Databricks Runtime 17.2 ve üzeri dinamik verilerin üzerine yazma işlemlerine izin verir.

Eski davranışlar için REPLACE USING 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.

REPLACE ON

Sql, Databricks Runtime 17.1 ve üzerinde desteklenir. Python ve Scala, Databricks Runtime 18.2 ve üzeri sürümlerde desteklenir.

REPLACE ON, REPLACE USING’den farklı olarak, kullanıcı tanımlı bir koşul eşleştiğinde satırları değiştirir; REPLACE USING ise belirtilen sütunlar eşitlik karşılaştırmasına göre eşit olduğunda satırları değiştirir. REPLACE USING öğesinin desteklemediği bir eşleştirme mantığına ihtiyaç duyduğunuzda, örneğin NULL değerlerini eşit kabul etmek için REPLACE ON kullanın.

İsteğe bağlı olarak, hedef tablo için bir takma ad belirtmek üzere targetAlias seçeneğini ve kaynak veriler için bir takma ad belirtmek üzere .as() veya .alias() API'lerini kullanın.

SQL söz dizimi için bkz INSERT. .

Python

(sourceDataDF.alias("s")
  .write
  .mode("overwrite")
  .option("targetAlias", "t")
  .option("replaceOn", "s.event_id <=> t.event_id AND s.start_date <=> t.start_date")
  .saveAsTable("events")
)

Scala

sourceDataDF.as("s")
  .write
  .mode("overwrite")
  .option("targetAlias", "t")
  .option("replaceOn", "s.event_id <=> t.event_id AND s.start_date <=> t.start_date")
  .saveAsTable("events")

SQL

INSERT INTO TABLE events AS t
  REPLACE ON (s.event_id <=> t.event_id AND s.start_date <=> t.start_date)
  (SELECT * FROM source_data) AS s

Kaynak sorguları boş olduğunda, REPLACE ON herhangi bir tablo satırını silmez.

partitionOverwriteMode ile dinamik bölüm üzerine yazma (eski)

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 öğ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.