Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Delta Lake memiliki opsi berbeda berikut untuk penimpaan selektif:
- Opsi
replaceWheresecara atomik menggantikan semua catatan 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.
Important
Jika data ditimpa secara tidak sengaja, Anda dapat menggunakan mengembalikan untuk membatalkan ubahannya.
Timpa selektif arbitrer dengan replaceWhere
Anda dapat secara selektif menimpa hanya data yang cocok dengan ekspresi sembarang.
Note
SQL memerlukan Databricks Runtime 12.2 LTS atau lebih tinggi.
Misalnya, ganti peristiwa secara atomik pada bulan Januari dalam tabel target, yang dipartisi oleh start_date, dengan data di replace_data.
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
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
Note
REPLACE WHERE menerima sebuah boolean_expression dengan beberapa batasan. Lihat INSERT di referensi bahasa SQL.
Perilaku warisan
Jika Anda menggunakan perilaku lama replaceWhere, kueri hanya menimpa data di kolom partisi yang cocok dengan predikat. Perintah berikut akan secara atomik menggantikan 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'")
.saveAsTable("people10m")
)
Scala
df.write
.mode("overwrite")
.option("replaceWhere", "birthDate >= '2017-01-01' AND birthDate <= '2017-01-31'")
.saveAsTable("people10m")
Untuk menggunakan perilaku lama, atur spark.databricks.delta.replaceWhere.dataColumns.enabled flag ke false:
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
Penulisan ulang partisi dinamis hanya memperbarui partisi yang menyimpan data baru dan membiarkan partisi lainnya tetap tidak berubah.
Azure Databricks merekomendasikan REPLACE USING untuk memicu penimpaan partisi dinamis. Mode ini berfungsi di semua jenis komputasi, termasuk gudang Databricks SQL, komputasi tanpa server, dan komputasi klasik, dan tidak mengharuskan Anda mengatur konfigurasi sesi Spark. Lihat Pemutakhiran partisi dinamis dengan REPLACE USING.
partitionOverwriteMode adalah mode warisan untuk penimpaan partisi dinamis yang mengharuskan Anda menggunakan komputasi klasik dan mengatur konfigurasi sesi Spark. Ini tidak didukung pada Databricks SQL atau komputasi tanpa server. Lihat Partisi dinamis ditimpa dengan partitionOverwriteMode (warisan).
Bagian di bawah ini menunjukkan cara menggunakan setiap mode.
Partisi dinamis ditimpa dengan REPLACE USING
Databricks Runtime versi 16.3 ke atas mendukung penulisan ulang partisi dinamis untuk tabel menggunakan REPLACE USING. Anda dapat secara selektif menimpa data di semua jenis komputasi, tanpa perlu mengatur konfigurasi sesi Spark.
REPLACE USING memungkinkan perilaku timpa atomik yang independen dari komputasi, yang berfungsi pada gudang Databricks SQL, komputasi tanpa server, dan komputasi klasik.
REPLACE USING hanya mengganti partisi yang ditargetkan oleh data masuk. Semua partisi lainnya tetap tidak berubah.
REPLACE USING hanya didukung di SQL. Untuk detailnya, lihat INSERT di referensi bahasa SQL.
Contoh berikut menggunakan REPLACE USING:
INSERT INTO TABLE events
REPLACE USING (event_id, start_date)
SELECT * FROM source_data
Ingatlah batasan dan perilaku berikut ini untuk penggantian partisi yang dinamis:
- Anda harus menentukan kumpulan lengkap kolom partisi tabel dalam
USINGklausa. - Selalu validasi bahwa data yang ditulis hanya menyentuh partisi yang diharapkan. Baris tunggal di partisi yang salah dapat secara tidak sengaja menimpa seluruh partisi.
Jika Anda memerlukan logika pencocokan yang lebih dapat disesuaikan daripada yang REPLACE USING didukung, seperti memperlakukan NULL nilai sebagai sama, gunakan pelengkap REPLACE ON sebagai gantinya. Lihat INSERT untuk detailnya.
Partisi dinamis ditimpa dengan partitionOverwriteMode (warisan)
Important
Fitur ini ada di Pratinjau Publik.
Databricks Runtime 11.3 LTS ke atas mendukung penimpaan partisi dinamis untuk tabel yang dipartisi menggunakan mode timpa: entah INSERT OVERWRITE dalam SQL atau penulisan DataFrame dengan df.write.mode("overwrite"). Jenis penimpaan ini hanya tersedia untuk komputasi klasik, bukan gudang Databricks SQL atau komputasi tanpa server.
Peringatan
Jika memungkinkan, gunakan INSERT OVERWRITE REPLACE USING alih-alih menimpa partisi dengan INSERT OVERWRITE PARTITION dan spark.sql.sources.partitionOverwriteMode=dynamic. Penggantian partisi dapat menggunakan data usang ketika perubahan pemartisian terjadi.
Untuk menggunakan mode timpa partisi dinamis, atur konfigurasi spark.sql.sources.partitionOverwriteMode sesi Spark ke dynamic. Atau, Anda dapat mengatur opsi DataFrameWriter ke partitionOverwriteModedynamic. Jika ada, opsi khusus kueri menggantikan mode yang ditentukan dalam konfigurasi sesi. Nilai defaultnya untuk spark.sql.sources.partitionOverwriteMode adalah static.
Contoh berikut menggunakan partitionOverwriteMode:
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")
Ingatlah batasan dan perilaku berikut untuk partitionOverwriteMode:
- Anda tidak dapat mengatur
overwriteSchemaketrue. - Anda tidak dapat menentukan
partitionOverwriteModedanreplaceWheresecara bersamaan dalam operasiDataFrameWriteryang sama. - Jika Anda menentukan
replaceWherekondisi menggunakanDataFrameWriteropsi, Delta Lake menerapkan kondisi tersebut untuk mengontrol data mana yang ditimpa. Opsi ini lebih diutamakan daripadapartitionOverwriteModekonfigurasi tingkat sesi. - Selalu validasi bahwa data yang ditulis hanya menyentuh partisi yang diharapkan. Baris tunggal di partisi yang salah dapat secara tidak sengaja menimpa seluruh partisi.