Databricks 上でテーブルをクローンする
特定のバージョンで独立したコピーを作成するには、CLONEコマンドを使用してDelta LakeまたはApache Icebergテーブルをクローンします。ディープクローンは、データとメタデータの両方をコピーします。シャロークローンは、メタデータのみをコピーし、ソースデータファイルを参照するため、ディープクローンよりもコンピュートとストレージの使用量が少なくなります。
Databricks では、Parquet および Apache Iceberg テーブルのクローン作成もサポートされています。ParquetおよびApache IcebergテーブルをDelta Lakeに増分クローンするおよびマネージドIcebergテーブルをクローンするを参照してください。
Unity Catalog での複製の使用の詳細については、「Unity Catalog テーブルのシャロークローン」を参照してください。
Databricks では、異なる組織間でテーブルへの読み取り専用アクセスを提供するために OpenSharing を使用することをお勧めします。「オープン共有とは何ですか?」をご覧ください。
クローンの種類
次のクローンの種類が利用可能です:
Type | SQL構文 | 説明 |
|---|---|---|
ディープクローン |
| ソーステーブルから、データとメタデータの両方をストリームメタデータを含めてクローンターゲットにコピーします。ソーステーブルに書き込むストリームは、停止したところからクローンターゲットで再開できます。 |
シャロークローン |
| ソーステーブルからクローンターゲットにメタデータのみをコピーします。データファイルはコピーされていません。シャロークローンは、操作によるコンピュートリソースとストレージリソースの使用量が少ないため、作成費用を抑えることができます。 |
複製されるメタデータには、スキーマ、パーティション分割情報、不変条件、NULL 値の許容、および TBLPROPERTIES が含まれます。ディープクローンの場合のみ、ストリームと COPY INTO メタデータもクローンされます。クローンされないメタデータは、テーブルの説明、ユーザー定義のコミットメタデータ、Delta Lakeのテーブル履歴、およびタグなどのUnity Catalogプロパティです。
クローンメトリクス
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 TABLE test_clone_shallow SHALLOW CLONE test_clone_source;
Unity Catalogでは、既存のシャロークローンを上書きするためにCREATE OR REPLACEを使用することはできません。DROP TABLEに続けてCREATE TABLEを使用するか、新しいテーブル名を使用します。制限事項を参照してください。
両方のクローンに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
機械学習モデルの再現
機械学習のユースケースでは、機械学習モデルのトレーニングに使用されたテーブルのバージョンをアーカイブすることをお勧めします。将来のモデルは、このアーカイブされたデータセットを使用してテストできます。CLONEでデータセットバージョンをアーカイブするには、次の手順を実行します。
例えば、バージョン15のモデルをトレーニングするために使用したテーブルのバージョンをアーカイブするには、
CREATE TABLE model_dataset CLONE entire_dataset VERSION AS OF 15
本番運用テーブルでの短期間のエクスペリメント
本番運用テーブルを破損することなくワークフローをテストするには、シャロークローンを作成します。シャロークローンを使用すると、クローンされたテーブルでワークロードを実行できます。そのテーブルはすべての本番運用データを参照しますが、本番運用ワークロードには影響しません。
本番用テーブルのシャロークローンを作成します:
CREATE TABLE my_test SHALLOW CLONE my_prod_table;
Unity Catalogでは、既存のシャロークローンを上書きするためにCREATE OR REPLACEを使用することはできません。DROP TABLEに続けてCREATE 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 Lakeテーブルをアーカイブする。アーカイブテーブルのデータおよびログ保持期間は個別に指定できます。例えば:
- 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)
レガシー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 Lakeテーブルの場合、クローン作成により新しい増分コミットが作成されます。これには、最後のクローン以降のソーステーブルからの新しいメタデータとデータのみが含まれます。
- テーブルのクローンは、
Create Table As Select(CTAS)とは異なります。クローンは、データに加えて、ソーステーブルのメタデータもコピーします。パーティション、フォーマット、不変条件、NULL 値許容、またはその他の設定を指定する必要はありません。 - クローン表は、そのソース表とは独立した履歴を持ちます。クローンされたテーブルでのタイムトラベルクエリは、ソーステーブルと同じ入力では機能しません。