Databricks 上でテーブルをクローンする
clone
コマンドを使用して、特定のバージョンの Databricks 上の既存の Delta Lake テーブルのコピーを作成できます。クローンは、深いものでも浅いものでもかまいません。
Databricks では、Parquet テーブルと Iceberg テーブルのクローン作成もサポートされています。 「Parquet テーブルと Iceberg テーブルを Delta Lake に段階的に複製する」を参照してください。
Unity Catalog での複製の使用の詳細については、「 Unity Catalog テーブルのシャロークローン」を参照してください。
注
Databricks では、異なる組織にまたがるテーブルへの読み取り専用アクセスを提供するために Delta Sharing を使用することをお勧めします。 Delta Sharingは何ですか?」を参照してください。
クローンの種類
ディープクローンは、既存のテーブルのメタデータに加えて、ソーステーブルのデータをクローンターゲットにコピーする クローン です。 さらに、ストリーム メタデータも複製されるため、Delta テーブルに書き込むストリームをソース テーブルで停止し、中断したところから複製のターゲットで続行できます。
浅いクローンは、データ・ファイルをクローン・ターゲットにコピーしない クローン です。 テーブルのメタデータはソースと同等です。 これらのクローンは作成コストが安価です。
複製されるメタデータには、スキーマ、パーティション分割情報、不変条件、NULL 値の許容が含まれます。 ディープクローンの場合のみ、ストリームと COPY INTO メタデータもクローンされます。 複製されないメタデータは、テーブルの説明と ユーザー定義のコミット メタデータです。
Delta クローン操作のセマンティクスは何ですか?
Hive metastore に登録されている Delta テーブル、またはテーブルとして登録されていないファイルのコレクションを使用している場合、clone には次のセマンティクスがあります。
重要
Databricks Runtime 13.3 LTS 以降では、Unity Catalog で管理されるテーブルは浅いクローンをサポートします。 Unity Catalogテーブルのクローン セマンティクスは、他の環境のDelta Lakeクローン セマンティクスとは大きく異なります。 Unity Catalogテーブルの Shallow clone を参照してください。
ディープクローンまたはシャロークローンに加えられた変更は、クローン自体にのみ影響し、ソース表には影響しません。
浅いクローンは、ソースディレクトリ内の参照データファイルです。 ソース テーブルで
vacuum
を実行すると、クライアントは参照されるデータ ファイルを読み取ることができなくなり、FileNotFoundException
がスローされます。 この場合、浅いクローンに対してreplaceを指定してクローンを実行すると、クローンが修復されます。 これが頻繁に発生する場合は、代わりにソーステーブルに依存しないディープクローンを使用することを検討してください。ディープクローンは、クローン元のソースに依存しませんが、ディープクローンはデータとメタデータをコピーするため、作成にコストがかかります。
そのパスにすでにテーブルがあるターゲットに
replace
を使用してクローンを作成すると、そのパスに Delta ログが存在しない場合にログが作成されます。 既存のデータは、vacuum
を実行してクリーンアップできます。既存の Delta テーブルの場合、ソース テーブルの新しいメタデータと新しいデータを含む新しいコミットが作成されます。 この新しいコミットはインクリメンタルであり、最後のクローン以降の新しい変更のみがテーブルにコミットされます。
テーブルのクローン作成は、
Create Table As Select
やCTAS
と同じではありません。 クローンは、データに加えてソース表のメタデータをコピーします。 クローン作成の構文も単純で、パーティション分割、形式、不変条件、null 許容などはソース テーブルから取得されるため、指定する必要はありません。クローンテーブルには、ソーステーブルから独立した履歴があります。 クローンテーブルのタイムトラベルクエリーは、ソーステーブルと同じ入力では機能しません。
クローン構文の例
次のコード例は、深いクローンと浅いクローンを作成するための構文を示しています。
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)
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)
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
構文の詳細については、「 CREATE TABLE CLONE」を参照してください。
クローンメトリクス
CLONE
操作が完了すると、次のメトリクスが単一行 DataFrame として報告されます。
source_table_size
: 複製されるソース テーブルのサイズ (バイト単位)。source_num_of_files
: ソース テーブル内のファイルの数。num_removed_files
: テーブルを置き換える場合、現在のテーブルから削除されたファイルの数。num_copied_files
: ソースからコピーされたファイルの数(浅いクローンの場合は0)。removed_files_size
: 現在のテーブルから削除されるファイルのサイズ (バイト単位)。copied_files_size
: テーブルにコピーされたファイルのサイズ (バイト単位)。
権限
Databricks テーブルアクセスコントロール とクラウド プロバイダーのアクセス許可を構成する必要があります。
データアーカイブにクローンを使用する
ディープクローンを使用すると、アーカイブ目的で特定の時点でのテーブルの状態を保持できます。 ディープクローンを増分的に同期して、ディザスタリカバリのためにソーステーブルの更新された状態を維持できます。
-- Every month run
CREATE OR REPLACE TABLE archive_table CLONE my_prod_table
機械学習モデルの再現のためにクローンを使用する
機械学習を実行するときに、ML モデルをトレーニングしたテーブルの特定のバージョンをアーカイブしたい場合があります。 将来のモデルは、このアーカイブされたデータセットを使用してテストできます。
-- Trained model on version 15 of Delta table
CREATE TABLE model_dataset CLONE entire_dataset VERSION AS OF 15
本番用テーブルの短期間の実験のためのクローンの活用
テーブルを破損せずに本番テーブルでワークフローをテストするには、浅いクローンを簡単に作成できます。 これにより、すべての本番データを含むが本番ワークロードに影響を与えないクローンテーブルに対して任意のワークフローを実行できます。
-- 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;
クローンを使用してテーブルのプロパティを上書きする
テーブル プロパティのオーバーライドは、次の場合に特に役立ちます。
異なる部署とデータを共有するときに、所有者またはユーザーの情報でテーブルに注釈を付ける。
差分テーブルとテーブル履歴またはタイムトラベルのアーカイブが必要です。 アーカイブ表のデータ保持期間とログ保持期間を個別に指定できます。 例えば:
CREATE OR REPLACE TABLE archive_table CLONE prod.my_table
TBLPROPERTIES (
delta.logRetentionDuration = '3650 days',
delta.deletedFileRetentionDuration = '3650 days'
)
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)
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)