Mengkloning tabel di Azure Databricks
Anda dapat membuat salinan tabel Delta Lake yang ada di Azure Databricks pada versi tertentu menggunakan clone
perintah . Klon bisa dalam atau dangkal.
Azure Databricks juga mendukung kloning tabel Parquet dan Iceberg. Lihat Mengkloning parquet dan tabel Iceberg secara bertahap ke Delta Lake.
Untuk detail tentang menggunakan kloning dengan Unity Catalog, lihat Kloning dangkal untuk tabel Unity Catalog.
Catatan
Databricks merekomendasikan penggunaan Berbagi Delta untuk menyediakan akses baca-saja ke tabel di berbagai organisasi. Lihat Apa itu Berbagi Delta?.
Jenis klon
- Klon dalam adalah klon yang menyalin data tabel sumber ke target klon selain metadata tabel yang ada. Selain itu, metadata aliran juga dikloning sedemikian rupa sehingga aliran yang menulis ke tabel Delta dapat dihentikan pada tabel sumber dan dilanjutkan pada target klon dari tempat sebelumnya.
- Klon dangkal adalah klon yang tidak menyalin file data ke target klon. Metadata tabel setara dengan sumber. Klon ini lebih murah untuk dibuat.
Metadata yang dikloning meliputi: skema, informasi partisi, invarian, nullabilitas. Hanya untuk klon dalam, metadata aliran dan COPY INTO juga dikloning. Metadata yang tidak dikloning adalah deskripsi tabel dan metadata komit yang ditentukan pengguna.
Apa semantik operasi kloning Delta?
Jika Anda telah bekerja dengan tabel Delta yang terdaftar ke metastore Apache Hive atau kumpulan file yang tidak terdaftar sebagai tabel, kloning memiliki semantik berikut:
Penting
Dalam Databricks Runtime 13.3 LTS ke atas, tabel terkelola Unity Catalog memiliki dukungan untuk kloning dangkal. Kloning semantik untuk tabel Unity Catalog berbeda secara signifikan dari semantik klon Delta Lake di lingkungan lain. Lihat Kloning dangkal untuk tabel Unity Catalog.
- Setiap perubahan yang dilakukan pada klon dalam atau dangkal hanya mempengaruhi klon itu sendiri dan bukan tabel sumber.
- Klon dangkal mereferensikan file data di direktori sumber. Jika Anda menjalankan
vacuum
pada tabel sumber, klien tidak dapat lagi membaca file data yangFileNotFoundException
dirujuk dan dilemparkan. Dalam hal ini, menjalankan kloning dengan mengganti kloning dangkal memperbaiki kloning. Jika ini sering terjadi, pertimbangkan untuk menggunakan klon dalam sebagai gantinya yang tidak bergantung pada tabel sumber. - Klon dalam tidak bergantung pada sumber yang menjadi tempat bagi mereka dikloning, tetapi mahal untuk dibuat karena klon dalam menyalin data serta metadata.
- Kloning dengan
replace
ke target yang sudah memiliki tabel di jalur itu membuat log Delta jika tidak ada di jalur itu. Anda dapat menghapus data yang ada dengan menjalankanvacuum
. - Untuk tabel Delta yang sudah ada, penerapan baru dibuat yang menyertakan metadata baru dan data baru dari tabel sumber. Penerapan baru ini bertambah secara bertahap, yang berarti bahwa hanya perubahan baru sejak klon terakhir diterapkan pada tabel.
- Mengkloning tabel tidak sama dengan
Create Table As Select
atauCTAS
. Klon menyalin metadata tabel sumber selain data. Kloning juga memiliki sintaks yang lebih sederhana: Anda tidak perlu menentukan partisi, format, invarian, nullabilitas, dan sebagainya karena diambil dari tabel sumber. - Tabel kloning memiliki riwayat independen dari tabel sumbernya. Kueri perjalanan waktu pada tabel kloning tidak berfungsi dengan input yang sama saat berfungsi pada tabel sumbernya.
Contoh sintaks kloning
Contoh kode berikut menunjukkan sintaksis untuk membuat klon mendalam dan dan dangkal:
SQL
CREATE TABLE target_table CLONE source_table; -- Create a deep clone of source_table as target_table
CREATE OR REPLACE TABLE target_table CLONE source_table; -- Replace the target
CREATE TABLE IF NOT EXISTS target_table CLONE source_table; -- No-op if the target table exists
CREATE TABLE target_table SHALLOW CLONE source_table;
CREATE TABLE target_table SHALLOW CLONE source_table VERSION AS OF version;
CREATE TABLE target_table SHALLOW CLONE source_table TIMESTAMP AS OF timestamp_expression; -- timestamp can be like “2019-01-01” or like date_sub(current_date(), 1)
Python
from delta.tables import *
deltaTable = DeltaTable.forName(spark, "source_table")
deltaTable.clone(target="target_table", isShallow=True, replace=False) # clone the source at latest version
deltaTable.cloneAtVersion(version=1, target="target_table", isShallow=True, replace=False) # clone the source at a specific version
# clone the source at a specific timestamp such as timestamp="2019-01-01"
deltaTable.cloneAtTimestamp(timestamp="2019-01-01", target="target_table", isShallow=True, replace=False)
Scala
import io.delta.tables._
val deltaTable = DeltaTable.forName(spark, "source_table")
deltaTable.clone(target="target_table", isShallow=true, replace=false) // clone the source at latest version
deltaTable.cloneAtVersion(version=1, target="target_table", isShallow=true, replace=false) // clone the source at a specific version
deltaTable.cloneAtTimestamp(timestamp="2019-01-01", target="target_table", isShallow=true, replace=false) // clone the source at a specific timestamp
Untuk detail sintaks, lihat MEMBUAT KLON TABEL.
Metrik klon
CLONE
melaporkan metrik berikut sebagai DataFrame baris tunggal setelah operasi selesai:
source_table_size
: Ukuran tabel sumber yang dikloning dalam byte.source_num_of_files
: Jumlah file dalam tabel sumber.num_removed_files
: Jika tabel sedang diganti, berapa banyak file yang dihapus dari tabel saat ini.num_copied_files
: Jumlah file yang disalin dari sumber (0 untuk klon dangkal).removed_files_size
: Ukuran dalam byte file yang sedang dihapus dari tabel saat ini.copied_files_size
: Ukuran dalam byte file yang disalin ke tabel.
Izin
Anda harus mengonfigurasi izin untuk kontrol akses tabel Azure Databricks dan penyedia cloud Anda.
Kontrol akses tabel
Izin berikut diperlukan untuk klon dalam dan dangkal:
SELECT
izin pada tabel sumber.- Jika Anda menggunakan
CLONE
untuk membuat tabel baru, izinCREATE
pada database tempat Anda membuat tabel. - Jika Anda menggunakan
CLONE
untuk mengganti tabel, Anda harus memiliki izinMODIFY
pada tabel.
Izin penyedia cloud
Jika Anda telah membuat klon yang dalam, setiap pengguna yang membaca klon dalam harus memiliki akses baca ke direktori klon. Untuk membuat perubahan pada klon, pengguna harus memiliki akses tulis ke direktori klon.
Jika Anda telah membuat klon dangkal, setiap pengguna yang membaca klon dangkal memerlukan izin untuk membaca file dalam tabel asli, karena file data tetap berada di tabel sumber dengan klon dangkal, serta direktori klon. Untuk membuat perubahan pada klon, pengguna akan memerlukan akses tulis ke direktori klon.
Gunakan kloning untuk pengarsipan data
Anda dapat menggunakan klon mendalam untuk mempertahankan status tabel pada titik waktu tertentu untuk tujuan pengarsipan. Anda dapat menyinkronkan klon mendalam secara bertahap untuk mempertahankan status tabel sumber yang diperbarui untuk pemulihan bencana.
-- Every month run
CREATE OR REPLACE TABLE archive_table CLONE my_prod_table
Menggunakan kloning untuk reproduksi model ML
Saat melakukan pembelajaran mesin, Anda mungkin ingin mengarsipkan versi tabel tertentu tempat Anda melatih model ML. Model mendatang dapat diuji menggunakan kumpulan data yang diarsipkan ini.
-- Trained model on version 15 of Delta table
CREATE TABLE model_dataset CLONE entire_dataset VERSION AS OF 15
Menggunakan kloning untuk eksperimen jangka pendek pada tabel produksi
Untuk menguji alur kerja pada tabel produksi tanpa merusak tabel, Anda dapat dengan mudah membuat klon dangkal. Ini memungkinkan Anda untuk menjalankan alur kerja arbitrer pada tabel kloning yang berisi semua data produksi tetapi tidak memengaruhi beban kerja produksi apa pun.
-- Perform shallow clone
CREATE OR REPLACE TABLE my_test SHALLOW CLONE my_prod_table;
UPDATE my_test WHERE user_id is null SET invalid=true;
-- Run a bunch of validations. Once happy:
-- This should leverage the update information in the clone to prune to only
-- changed files in the clone if possible
MERGE INTO my_prod_table
USING my_test
ON my_test.user_id <=> my_prod_table.user_id
WHEN MATCHED AND my_test.user_id is null THEN UPDATE *;
DROP TABLE my_test;
Gunakan kloning untuk mengambil alih properti tabel
Ambil alih properti tabel sangat berguna untuk:
- Anotasi tabel dengan pemilik atau informasi pengguna saat berbagi data dengan unit bisnis yang berbeda.
- Diperlukan tabel Arsip Delta dan riwayat tabel atau perjalanan waktu. Anda dapat menentukan periode retensi data dan log secara independen untuk tabel arsip. Contohnya:
SQL
CREATE OR REPLACE TABLE archive_table CLONE prod.my_table
TBLPROPERTIES (
delta.logRetentionDuration = '3650 days',
delta.deletedFileRetentionDuration = '3650 days'
)
Python
dt = DeltaTable.forName(spark, "prod.my_table")
tblProps = {
"delta.logRetentionDuration": "3650 days",
"delta.deletedFileRetentionDuration": "3650 days"
}
dt.clone(target="archive_table", isShallow=False, replace=True, tblProps)
Scala
val dt = DeltaTable.forName(spark, "prod.my_table")
val tblProps = Map(
"delta.logRetentionDuration" -> "3650 days",
"delta.deletedFileRetentionDuration" -> "3650 days"
)
dt.clone(target="archive_table", isShallow = false, replace = true, properties = tblProps)