Databricks でテーブルを複製する
cloneコマンドを使用して、特定のバージョンで Databricks 上の既存のテーブルのコピーを作成します。クローンには、深いクローンと浅いクローンがあります。
Databricks では、Parquet テーブルと Apache Iceberg テーブルのクローン作成もサポートされています。「Parquet テーブルと Apache Iceberg テーブルを Delta Lake に段階的に複製する」を参照してください。
クローンと Unity Catalogの使用の詳細については、Unity Catalog テーブルのシャロークローンを参照してください。
Databricks では、Delta Sharing を使用して、異なる組織間のテーブルへの読み取り専用アクセスを提供することをお勧めします。 「Delta Sharing とは」を参照してください。
クローンの種類
次のクローンの種類が利用可能です:
Type | SQL構文 | 説明 |
|---|---|---|
ディープクローン |
| ソーステーブルから、データとメタデータの両方をストリームメタデータを含めてクローンターゲットにコピーします。ソーステーブルに書き込むストリームは、停止したところからクローンターゲットで再開できます。 |
シャロークローン |
| ソーステーブルからクローンターゲットにメタデータのみをコピーします。データファイルはコピーされていません。シャロークローンは、操作によるコンピュートリソースとストレージリソースの使用量が少ないため、作成費用を抑えることができます。 |
複製されるメタデータには、スキーマ、パーティション分割情報、不変条件、NULL 値の許容、および TBLPROPERTIES が含まれます。ディープクローンの場合のみ、ストリームと COPY INTO メタデータもクローンされます。複製されないメタデータは、テーブルの説明と ユーザー定義のコミット メタデータです。
クローンは、Delta Lake のテーブル履歴や、タグなどの Unity Catalog プロパティをコピーしません。「テーブル履歴を操作する」および「Unity Catalog セキュリティ保護可能なオブジェクトにタグを適用する」を参照してください。
Hive metastore のクローン操作の動作
Databricks Runtime 13.3 LTS 以降では、Unity Catalog マネージドテーブルはシャロークローンをサポートしています。Unity Catalog テーブルのクローンの挙動は、他の環境のクローンの挙動とは異なります。Unity Catalogテーブルのシャロークローンを参照してください。
Hive metastoreに登録されているDelta Lake テーブル、またはテーブルとして登録されていないファイルのコレクションの場合、clone には次の動作があります。
- ディープクローンまたはシャロークローンへの変更は、ソーステーブルに影響しません。
- シャロークローンはソースディレクトリ内のデータファイルを参照します。ソーステーブルで
VACUUMを実行すると、クライアントはこれらのデータファイルを読み取ることができなくなり、FileNotFoundExceptionが発生します。修復するには、シャロークローンでreplaceを指定してクローンを実行します。これが頻繁に発生する場合は、ソーステーブルに依存しないディープクローンを使用することを検討してください。 - ディープ クローンはソース テーブルに依存しませんが、データとメタデータの両方をコピーするため、作成に費用がかかります。
- そのパスにすでにテーブルがあるターゲットに
replaceを使用してクローニングすると、そのパスに Delta ログが存在しない場合に作成されます。既存のデータをクリーンアップするには、VACUUMを実行します。 - 既存のDeltaテーブルの場合、クローン作成により、最後のクローン以降のソーステーブルからの新しいメタデータとデータのみが含まれる新しい増分コミットが作成されます。
- テーブルのクローンは、
Create Table As Select(CTAS)とは異なります。クローンは、データに加えて、ソーステーブルのメタデータもコピーします。パーティション、フォーマット、不変条件、NULL 値許容、またはその他の設定を指定する必要はありません。 - クローン表は、そのソース表とは独立した履歴を持ちます。クローンされたテーブルでのタイムトラベルクエリは、ソーステーブルと同じ入力では機能しません。
メトリクスのクローン作成
CLONE オペレーションが完了すると、次のメトリクスを単一行のデータフレームとしてレポートします:
source_table_size: クローニングされるソーステーブルのサイズ (バイト単位)。source_num_of_files: ソース テーブル内のファイルの数。num_removed_files: テーブルを置き換える場合、現在のテーブルから削除されるファイルの数。num_copied_files: ソースからコピーされたファイルの数 (浅いクローンの場合は 0)。removed_files_size: 現在のテーブルから削除されるファイルのサイズ (バイト単位)。copied_files_size: テーブルにコピーされたファイルのサイズ (バイト単位)。

権限
Databricks テーブルアクセスコントロールとクラウドプロバイダーの権限を設定する必要があります。
テーブルアクセスコントロール
ディープ・クローンとシャロー・クローンの両方に、次の権限が必要です。
SELECTソース テーブルに対するアクセス許可。CLONEを使用して新しいテーブルを作成する場合は、テーブルを作成するデータベースに対するパーミッションCREATE。CLONEを使用してテーブルを置き換える場合は、テーブルに対するMODIFYパーミッションが必要です。
クラウドプロバイダーの権限
ディープクローンの閲覧者は、クローンのディレクトリへの読み取りアクセスが必要です。ライターには、クローンのディレクトリへの書き込みアクセスが必要です。
シャロークローンは、データファイルがソースに残るため、ソーステーブルのデータファイルとクローンのディレクトリの両方への読み取りアクセスを必要とします。ライターには、クローンのディレクトリへの書き込みアクセスが必要です。
例
深いクローンまたは浅いクローンを作成する
以下のコード例では、ディープクローンとシャロークローンを作成する方法を示します。
- SQL
- Python
- Scala
ディープクローンを作成します
CREATE TABLE target_table CLONE source_table;
既存のターゲットを置き換え:
CREATE OR REPLACE TABLE target_table CLONE source_table;
ディープクローンを作成、ターゲットがすでに存在する場合はスキップします。
CREATE TABLE IF NOT EXISTS target_table CLONE source_table;
最新バージョン、特定のバージョン、または特定のタイムスタンプでシャロークローンを作成します。タイムスタンプは、'2019-01-01'のような日付文字列、またはdate_sub(current_date(), 1)のような式にすることができます。
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;
Python DeltaTable API は Delta Lake 専用です。
最新バージョンでソースをクローンする:
from delta.tables import *
deltaTable = DeltaTable.forName(spark, "source_table")
deltaTable.clone(target="target_table", isShallow=True, replace=False)
特定のバージョンでソースのクローンを作成します:
deltaTable.cloneAtVersion(version=1, target="target_table", isShallow=True, replace=False)
特定のタイムスタンプでソースをクローンする:
deltaTable.cloneAtTimestamp(timestamp="2019-01-01", target="target_table", isShallow=True, replace=False)
Scala DeltaTable API は Delta Lake に固有です。
最新バージョンでソースをクローンする:
import io.delta.tables._
val deltaTable = DeltaTable.forName(spark, "source_table")
deltaTable.clone(target="target_table", isShallow=true, replace=false)
特定のバージョンでソースのクローンを作成します:
deltaTable.cloneAtVersion(version=1, target="target_table", isShallow=true, replace=false)
特定のタイムスタンプでソースをクローンする:
deltaTable.cloneAtTimestamp(timestamp="2019-01-01", target="target_table", isShallow=true, replace=false)
構文の詳細については、 CREATE TABLE CLONEを参照してください。
メタデータがコピーされたかどうかを確認してください CLONE
この例では、CLONE操作中にコピーされるメタデータ(具体的には、TBLPROPERTIES、Unity Catalogタグ、およびDelta Lake履歴)を確認します。
カスタムプロパティと非デフォルトのログ保持期間を持つソーステーブルを設定し、その後データを挿入してテーブル履歴を生成します:
CREATE OR REPLACE TABLE test_clone_source (id INT, val STRING)
TBLPROPERTIES ('my.custom.prop' = 'hello', 'delta.logRetentionDuration' = '12 days');
ALTER TABLE test_clone_source SET TAGS ('team' = 'data-eng', 'env' = 'prod');
INSERT INTO test_clone_source VALUES (1, 'a');
INSERT INTO test_clone_source VALUES (2, 'b');
ディープクローンとシャロークローンを作成します。
CREATE OR REPLACE TABLE test_clone_deep DEEP CLONE test_clone_source;
CREATE OR REPLACE TABLE test_clone_shallow SHALLOW CLONE test_clone_source;
両方のクローンにTBLPROPERTIESがコピーされていることを確認してください:
SHOW TBLPROPERTIES test_clone_source;
SHOW TBLPROPERTIES test_clone_deep;
SHOW TBLPROPERTIES test_clone_shallow;
Unity Catalog のタグがクローンにコピーされないことを確認してください。
SELECT catalog_name, schema_name, table_name, tag_name, tag_value FROM information_schema.table_tags WHERE table_name = 'test_clone_source';
SELECT catalog_name, schema_name, table_name, tag_name, tag_value FROM information_schema.table_tags WHERE table_name = 'test_clone_deep';
SELECT catalog_name, schema_name, table_name, tag_name, tag_value FROM information_schema.table_tags WHERE table_name = 'test_clone_shallow';
Delta Lake の履歴がクローンにコピーされないことを確認してください。
DESCRIBE HISTORY test_clone_source;
DESCRIBE HISTORY test_clone_deep;
DESCRIBE HISTORY test_clone_shallow;
クリーンアップ:
DROP TABLE IF EXISTS test_clone_shallow;
DROP TABLE IF EXISTS test_clone_source;
DROP TABLE IF EXISTS test_clone_deep;
データアーカイブ
ディープクローンを使用すると、アーカイブ目的で特定の時点でのテーブルの状態を保持できます。 ディープクローンを増分的に同期して、ディザスタリカバリのためにソーステーブルの更新された状態を維持できます。
アーカイブを同期するため、月に一度次のコマンドを実行します:
CREATE OR REPLACE TABLE archive_table CLONE my_prod_table
MLモデルの再現
機械学習のユースケースでは、MLモデルをトレーニングするために使用されたテーブルのバージョンをアーカイブするとよい場合があります。将来のモデルは、このアーカイブされたデータセットを使用してテストできます。CLONEでデータセットバージョンをアーカイブするには、次の手順を実行します。
例えば、バージョン15のモデルをトレーニングするために使用したテーブルのバージョンをアーカイブするには、
CREATE TABLE model_dataset CLONE entire_dataset VERSION AS OF 15
本番運用テーブルでの短期体験
本番運用テーブルを破損することなくワークフローをテストするには、シャロークローンを作成します。シャロークローンを使用すると、すべての本番運用データを含むクローン テーブルでワークロードを実行できますが、本番運用ワークロードには影響しません。
例
本番用テーブルのシャロークローンを作成します:
CREATE OR REPLACE TABLE my_test SHALLOW CLONE my_prod_table;
クローンで更新と検証を実行します:
UPDATE my_test WHERE user_id is null SET invalid=true;
準備ができたら、変更をマージしてください。マージでは、クローン内の更新情報を使用して、可能な限り変更されたファイルのみにプルーニングします。
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;
テーブルプロパティを上書きする
テーブルプロパティのオーバーライドは、特に次の場合に役立ちます。
- 異なるビジネスユニットとデータを共有するときに、所有者またはユーザー情報でテーブルに注釈を付けます。
- Delta テーブルとテーブル履歴またはタイムトラベルのアーカイブが必要です。 アーカイブ・テーブルに対して、データとログの保存期間を個別に指定できます。 例えば:
- SQL
- Python
- Scala
Delta Lake テーブルの場合:
CREATE OR REPLACE TABLE archive_table CLONE prod.my_table
TBLPROPERTIES (
delta.logRetentionDuration = '3650 days',
delta.deletedFileRetentionDuration = '3650 days'
)
Icebergテーブルの場合:
CREATE OR REPLACE TABLE archive_table CLONE prod.my_table
TBLPROPERTIES (
iceberg.logRetentionDuration = '3650 days',
iceberg.deletedFileRetentionDuration = '3650 days'
)
Python DeltaTable API は Delta Lake 固有です。
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 DeltaTable API は Delta Lake 固有です。
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)