Azure Databricks'te tablo kopyalama
Komutunu kullanarak Azure Databricks'te var olan bir Delta Lake tablosunun kopyasını belirli bir sürümde clone
oluşturabilirsiniz. Klonlar derin veya sığ olabilir.
Azure Databricks, Parquet ve Iceberg tablolarını kopyalamayı da destekler. Bkz. Parquet ve Iceberg tablolarını Delta Lake'e artımlı olarak kopyalama.
Unity Kataloğu ile kopya kullanma hakkında ayrıntılı bilgi için bkz . Unity Kataloğu tabloları için sığ kopya.
Not
Databricks, farklı kuruluşlar genelindeki tablolara salt okunur erişim sağlamak için Delta Sharing kullanılmasını önerir. Bkz . Delta Sharing nedir?.
Kopyalama türleri
- Derin kopya, var olan tablonun meta verilerine ek olarak kaynak tablo verilerini kopyalama hedefine kopyalayan bir kopyadır. Ayrıca, delta tablosuna yazan bir akışın bir kaynak tabloda durdurulabilmesi ve bir kopyanın hedefinde kaldığı yerden devam etmesi için akış meta verileri de kopyalanır.
- Sığ bir kopya, veri dosyalarını kopyalama hedefine kopyalamayan bir kopyadır. Tablo meta verileri kaynağa eşdeğerdir. Bu kopyaların oluşturulması daha ucuz.
Kopyalanan meta veriler şunlardır: şema, bölümleme bilgileri, sabit değerler, null atanabilirlik. Yalnızca derin kopyalarda, akış ve COPY INTO meta veri de kopyalanır. Meta veriler kopyalanmamış tablo açıklaması ve kullanıcı tanımlı işleme meta verileridir.
Delta kopyalama işlemlerinin semantiği nedir?
Hive meta veri deposuna kaydedilmiş bir Delta tablosuyla veya tablo olarak kaydedilmemiş bir dosya koleksiyonuyla çalışıyorsanız, clone aşağıdaki semantiği içerir:
Önemli
Databricks Runtime 13.3 LTS ve üzeri sürümlerde Unity Kataloğu yönetilen tabloları basit kopyaları destekler. Unity Kataloğu tabloları için kopya semantiği, diğer ortamlardaki Delta Lake kopya semantiğinden önemli ölçüde farklıdır. Bkz . Unity Kataloğu tabloları için basit kopya.
- Derin veya sığ kopyalarda yapılan tüm değişiklikler, kaynak tabloyu değil yalnızca kopyaları etkiler.
- Sığ kopyalar kaynak dizindeki veri dosyalarına başvurur. Kaynak tabloda çalıştırırsanız
vacuum
, istemciler artık başvurulan veri dosyalarını okuyamıyor ve birFileNotFoundException
oluşturulur. Bu durumda, kopyayı sığ kopya üzerinde yerine ile çalıştırmak kopyayı onarıyor. Bu durum sık sık gerçekleşirse, bunun yerine kaynak tabloya bağımlı olmayan derin bir kopya kullanmayı göz önünde bulundurun. - Derin kopyalamalar, kopyalandıkları kaynağa bağlı değildir, ancak derin bir kopya hem verileri hem de meta verileri kopyaladığı için oluşturulması pahalıdır.
- ile
replace
kopyalanması, o yolda zaten bir tablo bulunan bir hedefe kopyalanması, bu yolda yoksa bir Delta günlüğü oluşturur. komutunu çalıştırarakvacuum
mevcut verileri temizleyebilirsiniz. - Mevcut Delta tabloları için, yeni meta verileri ve kaynak tablodaki yeni verileri içeren yeni bir işleme oluşturulur. Bu yeni işleme artımlı olur, yani yalnızca son kopyadan bu yana yapılan yeni değişiklikler tabloya işlenir.
- Tabloyu kopyalama işlemi veya
Create Table As Select
ileCTAS
aynı değildir. Kopya, verilere ek olarak kaynak tablonun meta verilerini de kopyalar. Kopyalamanın daha basit söz dizimi de vardır: Kaynak tablodan alınırken bölümleme, biçim, sabit değerler, null atanabilirlik vb. belirtmeniz gerekmez. - Kopyalanan bir tablonun kaynak tablosundan bağımsız bir geçmişi vardır. Kopyalanan bir tablodaki zaman yolculuğu sorguları, kaynak tablosunda çalıştıkları girişlerle aynı girişlerle çalışmaz.
Örnek kopya söz dizimi
Aşağıdaki kod örneklerinde derin ve sığ kopya oluşturmaya yönelik söz dizimi gösterilmektedir:
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
Söz dizimi ayrıntıları için bkz. CREATE TABLE CLONE.
Ölçümleri kopyalama
CLONE
işlem tamamlandıktan sonra aşağıdaki ölçümleri tek satırlık DataFrame olarak bildirir:
-
source_table_size
: Bayt cinsinden kopyalanan kaynak tablonun boyutu. -
source_num_of_files
: Kaynak tablodaki dosya sayısı. -
num_removed_files
: Tablo değiştiriliyorsa, geçerli tablodan kaç dosya kaldırılır. -
num_copied_files
: Kaynaktan kopyalanan dosyaların sayısı (sığ klonlar için 0). -
removed_files_size
: Geçerli tablodan kaldırılan dosyaların bayt cinsinden boyutu. -
copied_files_size
: Tabloya kopyalanan dosyaların bayt cinsinden boyutu.
İzinler
Azure Databricks tablosu erişim denetimi ve bulut sağlayıcınız için izinleri yapılandırmanız gerekir.
Tabloya erişim denetimi
Hem derin hem de sığ kopyalarda aşağıdaki izinler gereklidir:
-
SELECT
izinlerini seçin. - Yeni bir tablo oluşturmak için kullanıyorsanız
CLONE
,CREATE
tabloyu oluşturduğunuz veritabanında izin verin. - Bir tabloyu değiştirmek için kullanıyorsanız
CLONE
, tablo üzerinde izniniz olmalıdırMODIFY
.
Bulut sağlayıcısı izinleri
Derin bir kopya oluşturduysanız, derin kopyayı okuyan tüm kullanıcıların kopyanın dizinine okuma erişimi olmalıdır. Kopyada değişiklik yapmak için kullanıcıların kopyanın dizinine yazma erişimi olmalıdır.
Sığ bir kopya oluşturduysanız, sığ kopyayı okuyan herhangi bir kullanıcının özgün tablodaki dosyaları okuma iznine sahip olması gerekir, çünkü veri dosyaları hem sığ kopyalarla hem de kopyanın diziniyle kaynak tabloda kalır. Kopyada değişiklik yapmak için kullanıcıların kopyanın dizinine yazma erişimine sahip olması gerekir.
Veri arşivleme için kopya kullanma
Arşivleme amacıyla bir tablonun belirli bir noktadaki durumunu korumak için derin kopya kullanabilirsiniz. Olağanüstü durum kurtarma için kaynak tablonun güncelleştirilmiş durumunu korumak için derin kopyaları artımlı olarak eşitleyebilirsiniz.
-- Every month run
CREATE OR REPLACE TABLE archive_table CLONE my_prod_table
ML modeli çoğaltması için klon kullanma
Makine öğrenmesi yaparken, ml modelini eğittiğiniz tablonun belirli bir sürümünü arşivleyebilirsiniz. Gelecekteki modeller bu arşivlenmiş veri kümesi kullanılarak test edilebilir.
-- Trained model on version 15 of Delta table
CREATE TABLE model_dataset CLONE entire_dataset VERSION AS OF 15
Üretim tablosunda kısa süreli denemeler için klon kullanma
Üretim tablosundaki bir iş akışını tabloyu bozmadan test etmek için kolayca sığ bir kopya oluşturabilirsiniz. Bu, kopyalanan tabloda tüm üretim verilerini içeren ancak üretim iş yüklerini etkilemeyen rastgele iş akışları çalıştırmanızı sağlar.
-- 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;
Tablo özelliklerini geçersiz kılmak için kopya kullanma
Tablo özelliği geçersiz kılmaları özellikle şunlar için kullanışlıdır:
- Farklı iş birimleriyle veri paylaşırken sahip veya kullanıcı bilgileriyle tablolara açıklama ekleme.
- Delta tablolarının ve tablo geçmişinin arşivlenmesi veya zaman yolculuğu gereklidir. Arşiv tablosu için verileri ve günlük saklama sürelerini bağımsız olarak belirtebilirsiniz. Örneğin:
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)