Bagikan melalui


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 yang FileNotFoundException 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 menjalankan vacuum.
  • 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 atau CTAS. 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.

Contoh mengkloning metrik

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, izin CREATE pada database tempat Anda membuat tabel.
  • Jika Anda menggunakan CLONE untuk mengganti tabel, Anda harus memiliki izin MODIFY 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)