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.
Buat salinan tabel yang sudah ada di Azure Databricks pada versi tertentu menggunakan clone perintah . Klon bisa dalam atau dangkal.
Azure Databricks juga mendukung kloning tabel Parquet dan Apache Iceberg. Lihat Pengkloningan bertahap tabel Parquet dan Apache Iceberg ke Delta Lake.
Untuk detail tentang menggunakan kloning dengan Unity Catalog, lihat Kloning dangkal untuk tabel Unity Catalog.
Catatan
Databricks merekomendasikan penggunaan Delta Sharing 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 mendalam, stream dan metadata COPY INTO juga akan dikloning. Metadata yang tidak dikloning adalah deskripsi tabel dan metadata komit yang ditentukan pengguna.
Apa makna operasi kloning Delta?
Jika Anda bekerja dengan tabel Delta yang terdaftar di metastore Hive atau sekumpulan berkas yang tidak terdaftar sebagai tabel, kloning memiliki semantik berikut:
Penting
Dalam Databricks Runtime 13.3 LTS dan versi yang lebih baru, tabel terkelola Unity Catalog memiliki dukungan untuk kloning dangkal. Semantik klon untuk tabel Unity Catalog berbeda dari semantik klon di lingkungan lain. Lihat Kloning parsial untuk Unity Catalog tabel.
- 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
vacuumpada tabel sumber, klien tidak dapat lagi membaca file data yang dirujuk dan sebuahFileNotFoundExceptiondilemparkan. Dalam hal ini, menjalankan perintah 'replace' pada klon dangkal memperbaiki klon tersebut. Jika ini sering terjadi, pertimbangkan untuk menggunakan klon dalam sebagai gantinya yang tidak bergantung pada tabel sumber. - Klona dalam tidak bergantung pada sumber dari mana mereka diklon, tetapi mahal untuk dibuat karena klona dalam menyalin data dan metadata.
- Kloning dengan
replaceke target yang sudah memiliki tabel di jalur tersebut akan membuat log Delta jika belum ada log Delta di jalur tersebut. Anda dapat menghapus data yang ada dengan menjalankanvacuum. - Untuk tabel Delta yang sudah ada, commit baru dibuat yang menyertakan metadata baru dan data baru dari tabel sumber. Komit baru ini bersifat inkremental, yang berarti bahwa hanya perubahan baru sejak pengklonan terakhir dimasukkan ke dalam tabel.
- Mengkloning tabel tidak sama dengan
Create Table As SelectatauCTAS. Klon menyalin metadata dari tabel sumber beserta datanya. Kloning juga memiliki sintaks yang lebih sederhana: Anda tidak perlu menentukan partisi, format, invarian, nullability, dan sebagainya saat diambil dari tabel sumber. - Tabel kloning memiliki riwayat independen dari tabel sumbernya. Kueri perjalanan waktu pada tabel hasil kloning tidak berfungsi dengan input yang sama seperti saat diterapkan pada tabel sumber.
Contoh sintaks kloning
Contoh kode berikut menunjukkan sintaksis untuk membuat klon mendalam 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)
Phyton
API Python DeltaTable ini khusus untuk Delta Lake.
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
API Scala DeltaTable ini khusus untuk Delta Lake.
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 CREATE TABLE CLONE.
Metode pengukuran klon
CLONE melaporkan metrik berikut sebagai DataFrame baris tunggal setelah operasi selesai:
-
source_table_size: Ukuran tabel sumber yang sedang 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 file dalam byte dari file-file yang disalin ke tabel.
Perizinan
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:
-
SELECTperizinan pada tabel sumber. - Jika Anda menggunakan
CLONEuntuk membuat tabel baru, izinCREATEpada database tempat Anda membuat tabel. - Jika Anda menggunakan
CLONEuntuk mengganti tabel, Anda harus memiliki izinMODIFYpada tabel.
Izin penyedia cloud
Jika Anda telah membuat klon mendalam, setiap pengguna yang membaca klon mendalam harus memiliki akses baca ke direktori kloning. Untuk membuat perubahan pada kloning, pengguna harus memiliki akses tulis ke direktori kloning.
Jika Anda telah membuat kloning dangkal, setiap pengguna yang membaca kloning dangkal memerlukan izin untuk membaca file dalam tabel asli, karena file data tetap berada di tabel sumber dengan kloning dangkal, serta direktori kloning. Untuk membuat perubahan pada kloning, pengguna akan memerlukan akses tulis ke direktori kloning.
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 secara mendetail secara bertahap untuk menjaga agar status tabel sumber tetap 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
Gunakan 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
Pengaturan ulang properti tabel sangat berguna untuk:
- Anotasi tabel dengan pemilik atau informasi pengguna saat berbagi data dengan unit bisnis yang berbeda.
- Diperlukan mengarsipkan tabel Delta dan lacak riwayat tabel. Anda dapat menentukan periode retensi data dan log secara independen untuk tabel arsip. Contohnya:
SQL
-- For Delta tables
CREATE OR REPLACE TABLE archive_table CLONE prod.my_table
TBLPROPERTIES (
delta.logRetentionDuration = '3650 days',
delta.deletedFileRetentionDuration = '3650 days'
)
-- For Iceberg tables
CREATE OR REPLACE TABLE archive_table CLONE prod.my_table
TBLPROPERTIES (
iceberg.logRetentionDuration = '3650 days',
iceberg.deletedFileRetentionDuration = '3650 days'
)
Phyton
API Python DeltaTable ini khusus untuk Delta Lake.
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
API Scala DeltaTable ini khusus untuk Delta Lake.
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)