Menggantikan data secara selektif dengan Delta Lake

Delta Lake memiliki opsi berbeda berikut untuk penimpaan selektif:

  • Opsi replaceWhere secara 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 USING klausa.
  • 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 overwriteSchema ke true.
  • Anda tidak dapat menentukan partitionOverwriteMode dan replaceWhere secara bersamaan dalam operasi DataFrameWriter yang sama.
  • Jika Anda menentukan replaceWhere kondisi menggunakan DataFrameWriter opsi, Delta Lake menerapkan kondisi tersebut untuk mengontrol data mana yang ditimpa. Opsi ini lebih diutamakan daripada partitionOverwriteMode konfigurasi 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.