Aracılığıyla paylaş


Azure Databricks'te tablo kopyalama

komutunu kullanarak clone belirli bir sürümde Azure Databricks'te var olan bir tablonun kopyasını oluşturun. Klonlar derin veya sığ olabilir.

Azure Databricks, Parquet ve Apache Iceberg tablolarını kopyalamayı da destekler. Bkz. Parquet ve Apache Iceberg tablolarını Delta Lake'e artımlı olarak kopyalama.

Unity Kataloğu ile çoğaltmayı kullanma hakkında ayrıntılı bilgi için bkz. Unity Kataloğu tabloları için Shallow Clone.

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?.

Klon 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 kopyanın hedef tablosunda kaldığı yerden devam edebilmesi için akış meta verileri de klonlanı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, değişmezler, boş değer atanabilirliği. 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 kayıtlı 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 Catalog tarafından yönetilen tablolar, yüzeysel kopyaları destekler. Unity Kataloğu tabloları için kopya semantiği, diğer ortamlardaki kopya semantiğinden farklıdır. Unity Kataloğu tabloları için Shallow clone ifadesine bakın.

  • 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 bir FileNotFoundException oluşturulur. Bu durumda, sığ kopya üzerinde "replace" ile klonu çalıştırmak klonu onarır. 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.
  • replace kullanılarak kopyalama, bu yol üzerinde zaten bir tablo bulunan bir hedefe gönderildiğinde ve bu yolda bir Delta günlüğü mevcut değilse, bir Delta günlüğü oluşturur. komutunu çalıştırarak vacuummevcut 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 klonlama, Create Table As Select veya CTAS ile aynı değildir. Kopya, verilere ek olarak kaynak tablonun meta verilerini de kopyalar. Kopyalama işleminin daha basit bir söz dizimi vardır: bölümleme, biçim, sabit değerler, null değer atanabilirliği vb. özellikleri belirtmeniz gerekmez, çünkü bunlar kaynak tablodan alındıkları için otomatik olarak uygulanır.
  • Kopyalanan bir tablonun kaynak tablosundan bağımsız bir geçmişi vardır. Kopyalanan bir tablodaki zaman bazlı sorgular, kaynak tabloda kullanılan aynı girişlerle çalışmaz.

Örnek klon 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)

Piton

Python DeltaTable API'si Delta Lake'e özgüdür.

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 programlama dili

Scala DeltaTable API'si Delta Lake'e özgüdür.

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.

Metrikleri klonlama

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.

Klon metrikleri örneği

İ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ığ kopyalar için aşağıdaki izinler gereklidir:

  • SELECT kaynak tablosu üzerindeki izinler.
  • Yeni bir tablo oluşturmak için CLONE kullanıyorsanız, tabloyu oluşturduğunuz veritabanında CREATE izinlerine sahip olun.
  • Tabloyu değiştirmek için CLONE kullanıyorsanız, tablo üzerinde MODIFY iznine sahip olmalısınız.

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 bir kaynak tablonun güncellenmiş bir durumunu korumak amacıyla derin kopyaları artımlı olarak eşitleyebilirsiniz.

-- Every month run
CREATE OR REPLACE TABLE archive_table CLONE my_prod_table

Makine öğrenimi modeli çoğaltmak için klon kullanın.

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 aşmak için klon kullanma

Tablo özelliklerinin geçersiz kılınması özellikle şu durumlar 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 geçmişe yönelik sorgulama yapılması gereklidir. Arşiv tablosu için verileri ve günlük saklama sürelerini bağımsız olarak belirtebilirsiniz. Örneğin:

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'
)

Piton

Python DeltaTable API'si Delta Lake'e özgüdür.

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 programlama dili

Scala DeltaTable API'si Delta Lake'e özgüdür.

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)