Aracılığıyla paylaş


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 kopyalar için akış ve COPY INTO meta verileri de kopyalanmıştı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 bir FileNotFoundException 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ı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 kopyalama işlemi veya CTASile Create Table As Select 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.

Ölçümleri kopyalama ö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ığ 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ır MODIFY .

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)