Azure Databricks でテーブルを複製する

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

Azure Databricks では、Parquet テーブルと Apache Iceberg テーブルの複製もサポートされています。 Parquet テーブルと Apache Iceberg テーブルを Delta Lake に増分複製し、マネージド Iceberg テーブルを複製するを参照してください。

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

Note

Databricks では、OpenSharing を使用して、さまざまな組織のテーブルに読み取り専用アクセスを提供することをお勧めします。 OpenSharing とはを参照してください。

複製の種類

次の複製の種類を使用できます。

タイプ SQL 構文 Description
ディープ クローン CLONE または DEEP CLONE ソース テーブルのデータとメタデータの両方を、ストリーム メタデータを含む複製ターゲットにコピーします。 ソース テーブルに書き込むストリームは、中断した場所から複製ターゲットで停止して続行できます。
シャロー クローン SHALLOW CLONE ソース テーブルから複製ターゲットにメタデータのみをコピーします。 データ ファイルはコピーされません。 浅い複製は、操作で使用されるコンピューティング リソースとストレージ領域が少ないため、作成にコストがかかります。

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

Note

ストリーミング テーブルと具体化されたビューは、 CLONEをサポートしていません。 ストリーミング テーブルまたは具体化されたビューを、ディープ クローンまたはシャロー クローンのソースまたはターゲットとして使用することはできません。 制限事項制限事項を参照してください。

クローン指標

CLONE 操作が完了すると、次のメトリックが単一行データフレームとして報告されます。

  • source_table_size: 複製されるソース テーブルのサイズ (バイト単位)。
  • source_num_of_files: ソース テーブル内のファイルの数。
  • num_removed_files: テーブルが置き換えられる場合、現在のテーブルから削除されるファイルの数。
  • num_copied_files: ソースからコピーされたファイルの数 (シャロー複製の場合は 0)。
  • removed_files_size: 現在のテーブルから削除されるファイルのサイズ (バイト単位)。
  • copied_files_size: テーブルにコピーされるファイルのサイズ (バイト単位)。

複製のメトリックのサンプル

Permissions

Azure Databricks テーブル アクセス制御とクラウド プロバイダーのアクセス許可を構成する必要があります。

テーブルのアクセス制御

ディープクローンとシャロークローンには、次のアクセス許可が必要です。

  • ソース テーブルに対する SELECT アクセス許可。
  • CLONE を使用して新しいテーブルを作成する場合は、テーブル作成先のデータベースに対する CREATE アクセス許可。
  • CLONE を使用してテーブルを置き換える場合は、テーブルに対する MODIFY アクセス許可が必要です。

クラウド プロバイダーのアクセス許可

ディープ クローンの閲覧者は、複製のディレクトリへの読み取りアクセス権を必要とします。 ライターには、複製のディレクトリへの書き込みアクセス権が必要です。

浅い複製のリーダーは、ソース テーブルのデータ ファイルと複製のディレクトリの両方に対する読み取りアクセス権を必要とします。データ ファイルはソースに残るためです。 ライターには、複製のディレクトリへの書き込みアクセス権が必要です。

Examples

ディープ クローンまたはシャロー クローンを作成する

次のコード例は、深いクローンと浅いクローンを作成する方法を示しています。

SQL

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

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

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

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;

Note

Unity カタログでは、 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;

データのアーカイブ

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

月に 1 回、次のコマンドを実行してアーカイブを同期します。

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 TABLE my_test SHALLOW CLONE my_prod_table;

Note

Unity カタログでは、 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;

テーブルのプロパティをオーバーライドする

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

  • さまざまな部署でデータを共有するときに、テーブルに所有者またはユーザー情報の注釈を付ける。
  • アーカイブでタイムトラベル機能が必要な場合の、差分テーブルのアーカイブ。 アーカイブ テーブルには、データとログの保持期間を個別に指定できます。 例えば次が挙げられます。

SQL

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

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

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 メタストアのクローン操作の動作

Important

Databricks Runtime 13.3 LTS 以降では、Unity カタログマネージド テーブルでは浅いクローンがサポートされています。 Unity カタログ テーブルの複製動作は、他の環境での複製動作とは異なります。 Unity カタログ テーブルの簡易クローンを参照してください。

Hive メタストアに登録されている Delta Lake テーブル、またはテーブルとして登録されていないファイルのコレクションの場合、複製には次の動作があります。

  • ディープ クローンまたはシャロー クローンに対する変更は、ソース テーブルには影響しません。
  • シャロー複製は、ソース ディレクトリ内のデータ ファイルを参照します。 ソース テーブルで VACUUM を実行すると、クライアントはそれらのデータ ファイルを読み取れなくなり、 FileNotFoundExceptionが発生します。 修復するには、浅いクローンに対して clone コマンドを replace で実行します。 これが頻繁に発生する場合は、ソース テーブルに依存しないディープ クローンの使用を検討してください。
  • ディープ クローンはソース テーブルに依存しませんが、データとメタデータの両方をコピーするため、作成にコストがかかります。
  • replace を使用してターゲットに複製し、そのパスにテーブルが既に存在している場合、Delta ログが存在しない場合は作成されます。 VACUUMを実行して、既存のデータをクリーンアップします。
  • 既存の Delta Lake テーブルの場合、複製によって新しい増分コミットが作成されます。このコミットには、最後の複製以降のソース テーブルからの新しいメタデータとデータのみが含まれます。
  • テーブルの複製は、 Create Table As Select (CTAS) とは異なります。 複製は、データに加えてソース テーブルのメタデータをコピーします。 パーティション分割、フォーマット、インバリアント、null 許容、またはその他の設定を指定する必要はありません。
  • 複製されたテーブルには、ソース テーブルとは独立した履歴があります。 複製されたテーブルに対するタイム トラベル クエリは、ソース テーブルと同じ入力では機能しません。