メインコンテンツまでスキップ

Databricks 上でテーブルをクローンする

特定のバージョンで独立したコピーを作成するには、CLONEコマンドを使用してDelta LakeまたはApache Icebergテーブルをクローンします。ディープクローンは、データとメタデータの両方をコピーします。シャロークローンは、メタデータのみをコピーし、ソースデータファイルを参照するため、ディープクローンよりもコンピュートとストレージの使用量が少なくなります。

Databricks では、Parquet および Apache Iceberg テーブルのクローン作成もサポートされています。ParquetおよびApache IcebergテーブルをDelta Lakeに増分クローンするおよびマネージドIcebergテーブルをクローンするを参照してください。

Unity Catalog での複製の使用の詳細については、「Unity Catalog テーブルのシャロークローン」を参照してください。

注記

Databricks では、異なる組織間でテーブルへの読み取り専用アクセスを提供するために OpenSharing を使用することをお勧めします。「オープン共有とは何ですか?」をご覧ください。

クローンの種類

次のクローンの種類が利用可能です:

Type

SQL構文

説明

ディープクローン

CLONE または DEEP CLONE

ソーステーブルから、データとメタデータの両方をストリームメタデータを含めてクローンターゲットにコピーします。ソーステーブルに書き込むストリームは、停止したところからクローンターゲットで再開できます。

シャロークローン

SHALLOW CLONE

ソーステーブルからクローンターゲットにメタデータのみをコピーします。データファイルはコピーされていません。シャロークローンは、操作によるコンピュートリソースとストレージリソースの使用量が少ないため、作成費用を抑えることができます。

複製されるメタデータには、スキーマ、パーティション分割情報、不変条件、NULL 値の許容、および TBLPROPERTIES が含まれます。ディープクローンの場合のみ、ストリームと COPY INTO メタデータもクローンされます。クローンされないメタデータは、テーブルの説明、ユーザー定義のコミットメタデータ、Delta Lakeのテーブル履歴、およびタグなどのUnity Catalogプロパティです。

注記

ストリーミングテーブルとマテリアライズドビューはCLONEをサポートしていません。ストリーミングテーブルまたはマテリアライズドビューを、ディープクローンまたはシャロークローンのソースまたはターゲットとして使用することはできません。「制限事項」および「制限事項」を参照してください。

クローンメトリクス

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
CREATE TABLE target_table CLONE source_table;

既存のターゲットを置き換え:

SQL
CREATE OR REPLACE TABLE target_table CLONE source_table;

ディープクローンを作成、ターゲットがすでに存在する場合はスキップします。

SQL
CREATE TABLE IF NOT EXISTS target_table CLONE source_table;

最新バージョン、特定のバージョン、または特定のタイムスタンプでシャロークローンを作成します。タイムスタンプは、'2019-01-01'のような日付文字列、またはdate_sub(current_date(), 1)のような式にすることができます。

SQL
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;

構文の詳細については、「CREATE TABLE CLONE」を参照してください。

コピーされたメタデータを確認する CLONE

この例は、CLONE 操作中にコピーされるメタデータとコピーされないメタデータ(具体的には TBLPROPERTIES、Unity Catalog のタグ、および Delta Lake の履歴)を示しています。

カスタムプロパティとデフォルト以外のログ保持期間を持つソーステーブルを作成し、データを挿入してテーブルの履歴を生成します:

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

ディープクローンとシャロークローンを作成します。

SQL
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がコピーされていることを確認してください:

SQL
SHOW TBLPROPERTIES test_clone_source;
SHOW TBLPROPERTIES test_clone_deep;
SHOW TBLPROPERTIES test_clone_shallow;

Unity Catalogのタグがクローンにコピーされないことを確認します:

SQL
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 の履歴がクローンにコピーされないことを確認してください。

SQL
DESCRIBE HISTORY test_clone_source;
DESCRIBE HISTORY test_clone_deep;
DESCRIBE HISTORY test_clone_shallow;

クリーンアップ:

SQL
DROP TABLE IF EXISTS test_clone_shallow;
DROP TABLE IF EXISTS test_clone_source;
DROP TABLE IF EXISTS test_clone_deep;

データアーカイブ

ディープクローンを使用して、特定の時点でのテーブルの状態をアーカイブ目的で保持できます。ディザスタリカバリのため、ソーステーブルの最新の状態を維持するために、ディープクローンを増分同期することが可能です。

アーカイブを同期するため、月に一度次のコマンドを実行します:

SQL
CREATE OR REPLACE TABLE archive_table CLONE my_prod_table

機械学習モデルの再現

機械学習のユースケースでは、機械学習モデルのトレーニングに使用されたテーブルのバージョンをアーカイブすることをお勧めします。将来のモデルは、このアーカイブされたデータセットを使用してテストできます。CLONEでデータセットバージョンをアーカイブするには、次の手順を実行します。

例えば、バージョン15のモデルをトレーニングするために使用したテーブルのバージョンをアーカイブするには、

SQL
CREATE TABLE model_dataset CLONE entire_dataset VERSION AS OF 15

本番運用テーブルでの短期間のエクスペリメント

本番運用テーブルを破損することなくワークフローをテストするには、シャロークローンを作成します。シャロークローンを使用すると、クローンされたテーブルでワークロードを実行できます。そのテーブルはすべての本番運用データを参照しますが、本番運用ワークロードには影響しません。

本番用テーブルのシャロークローンを作成します:

SQL
CREATE TABLE my_test SHALLOW CLONE my_prod_table;
注記

Unity Catalogでは、既存のシャロークローンを上書きするためにCREATE OR REPLACEを使用することはできません。DROP TABLEに続けてCREATE TABLEを使用するか、新しいテーブル名を使用します。制限事項を参照してください。

クローンで更新と検証を実行します:

SQL
UPDATE my_test WHERE user_id is null SET invalid=true;

準備ができたら、変更をマージしてください。マージでは、クローン内の更新情報を使用して、可能な限り変更されたファイルのみにプルーニングします。

SQL
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 *;

完了したらクローンを破棄してください:

SQL
DROP TABLE my_test;

テーブルのプロパティを上書きする

テーブルプロパティのオーバーライドは、以下の場合に役立ちます:

  • 異なる事業部署とデータを共有する際、テーブルに所有者またはユーザー情報を付与します。
  • アーカイブでタイムトラベルが必要となる場合にDelta Lakeテーブルをアーカイブする。アーカイブテーブルのデータおよびログ保持期間は個別に指定できます。例えば:

Delta Lake テーブルの場合:

SQL
CREATE OR REPLACE TABLE archive_table CLONE prod.my_table
TBLPROPERTIES (
delta.logRetentionDuration = '3650 days',
delta.deletedFileRetentionDuration = '3650 days'
)

Icebergテーブルの場合:

SQL
CREATE OR REPLACE TABLE archive_table CLONE prod.my_table
TBLPROPERTIES (
iceberg.logRetentionDuration = '3650 days',
iceberg.deletedFileRetentionDuration = '3650 days'
)

レガシー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 SelectCTAS)とは異なります。クローンは、データに加えて、ソーステーブルのメタデータもコピーします。パーティション、フォーマット、不変条件、NULL 値許容、またはその他の設定を指定する必要はありません。
  • クローン表は、そのソース表とは独立した履歴を持ちます。クローンされたテーブルでのタイムトラベルクエリは、ソーステーブルと同じ入力では機能しません。