Menimpa data secara selektif dengan Delta Lake
Azure Databricks memanfaatkan fungsionalitas Delta Lake untuk mendukung dua opsi berbeda untuk penimpaan selektif:
- Opsi secara
replaceWhere
atomik menggantikan semua rekaman yang cocok dengan predikat tertentu. - Anda dapat mengganti direktori data berdasarkan bagaimana tabel dipartisi menggunakan penimpaan partisi dinamis.
Untuk sebagian besar operasi, Databricks merekomendasikan penggunaan replaceWhere
untuk menentukan data mana yang akan ditimpa.
Penting
Jika data ditimpa secara tidak sengaja, Anda dapat menggunakan mengembalikan untuk membatalkan ubahannya.
Timpa selektif sewenang-wenang dengan replaceWhere
Anda hanya dapat menimpa data yang cocok dengan ekspresi sewenang-wenang secara selektif.
Catatan
SQL memerlukan Databricks Runtime 12.2 LTS atau lebih tinggi.
Perintah berikut secara atomik menggantikan peristiwa pada bulan Januari dalam tabel target, yang dipartisi oleh start_date
, dengan data dalam replace_data
:
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
Kode sampel ini menulis data dalam replace_data
, memvalidasi bahwa semua baris cocok dengan predikat, dan melakukan penggantian atom menggunakan overwrite
semantik. Jika ada nilai dalam operasi yang berada di luar batasan, operasi ini gagal dengan kesalahan secara default.
Anda dapat mengubah perilaku ini menjadi nilai overwrite
yang berada dalam rentang predikat dan insert
rekaman yang terletak di luar rentang yang ditentukan. Untuk melakukannya, nonaktifkan pemeriksaan batasan dengan mengatur spark.databricks.delta.replaceWhere.constraintCheck.enabled
ke false menggunakan salah satu pengaturan berikut:
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
Perilaku warisan
Perilaku default bawaan memiliki replaceWhere
menulis ulang data yang cocok dengan predikat pada hanya kolom partisi. Dengan model warisan ini, perintah berikut akan secara atomik mengganti bulan Januari dalam tabel target, yang dipartisi oleh date
, dengan data dalam df
:
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")
Jika Anda ingin kembali ke perilaku lama, Anda dapat menonaktifkan spark.databricks.delta.replaceWhere.dataColumns.enabled
bendera:
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
Penggantian partisi dinamis
Penting
Fitur ini ada di Pratinjau Publik.
Databricks Runtime 11.3 LTS ke atas mendukung mode penimpaan partisi dinamis
Dalam mode timpa partisi dinamis, operasi menimpa semua data yang ada di setiap partisi logis di mana penulisan menerapkan data baru. Setiap partisi logis yang ada yang tulisnya tidak berisi data tetap tidak berubah. Mode ini hanya berlaku ketika data sedang ditulis dalam mode penimpaan: baik INSERT OVERWRITE
dalam SQL, atau penulisan DataFrame dengan df.write.mode("overwrite")
.
Konfigurasikan mode timpa partisi dinamis dengan mengatur konfigurasi sesi Spark dari spark.sql.sources.partitionOverwriteMode
menjadi dynamic
. Anda juga dapat mengaktifkan ini dengan mengatur opsi DataFrameWriter
partitionOverwriteMode
ke dynamic
. Jika ada, opsi khusus kueri menimpa mode yang ditentukan dalam konfigurasi sesi. Default untuk partitionOverwriteMode
adalah static
.
Penting
Validasi bahwa data yang ditulis dengan timpa partisi dinamis hanya menyentuh partisi yang diharapkan. Satu baris dalam partisi yang salah dapat menyebabkan penimpaan seluruh partisi secara tidak sengaja.
Contoh berikut menunjukkan penggunaan penimpaan partisi secara dinamis:
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")
Catatan
- Partisi dinamis menyebabkan konflik dengan opsi
replaceWhere
untuk tabel yang memiliki partisi.- Jika penimpaan partisi dinamis diaktifkan dalam konfigurasi sesi Spark, dan
replaceWhere
disediakan sebagai opsiDataFrameWriter
, maka Delta Lake menimpa data sesuai dengan ekspresireplaceWhere
(opsi spesifik kueri menimpa konfigurasi sesi). - Anda akan menerima kesalahan jika opsi
DataFrameWriter
memiliki timpa partisi dinamis danreplaceWhere
diaktifkan.
- Jika penimpaan partisi dinamis diaktifkan dalam konfigurasi sesi Spark, dan
- Anda tidak dapat menentukan
overwriteSchema
sebagaitrue
saat menggunakan penulisan ulang partisi dinamis.