Databricks 上のテーブルのクローンを作成する

clone コマンドを使用して、特定のバージョンの Databricks 上の既存の Delta Lake テーブルのコピーを作成できます。クローンは、深いものでも浅いものでもかまいません。

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

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

Databricks では、 Delta Sharing使用して、さまざまな組織間でテーブルへの読み取り専用アクセスを提供することをお勧めします。 Delta Sharing使用してデータと AI アセットを安全に共有するを参照してください。

クローン・タイプ

  • ディープクローンは、既存のテーブルのメタデータに加えて、ソーステーブルのデータをクローンターゲットにコピーする クローン です。 さらに、ストリーム メタデータも複製されるため、Delta テーブルに書き込むストリームをソース テーブルで停止し、中断したところから複製のターゲットで続行できます。

  • 浅いクローンは、データ・ファイルをクローン・ターゲットにコピーしない クローン です。 テーブルのメタデータはソースと同等です。 これらのクローンは作成コストが安価です。

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

Delta クローン操作のセマンティクスは何ですか?

Hive metastore に登録されている Delta テーブル、またはテーブルとして登録されていないファイルのコレクションを使用している場合、clone には次のセマンティクスがあります。

重要

Databricks Runtime 13.1 以降では、Unity Catalog マネージド テーブルで浅い複製がサポートされています。 Unity Catalog テーブルの複製セマンティクスは、他の環境の Delta Lake 複製セマンティクスとは大きく異なります。 「 Unity Catalog テーブルの浅い複製」を参照してください。

  • ディープクローンまたはシャロークローンに加えられた変更は、クローン自体にのみ影響し、ソース表には影響しません。

  • 浅いクローンは、ソースディレクトリ内の参照データファイルです。 ソース テーブルで vacuum を実行すると、クライアントは参照されるデータ ファイルを読み取ることができなくなり、 FileNotFoundException がスローされます。 この場合、浅いクローンに対してreplaceを指定してクローンを実行すると、クローンが修復されます。 これが頻繁に発生する場合は、代わりにソーステーブルに依存しないディープクローンを使用することを検討してください。

  • ディープクローンは、クローン元のソースに依存しませんが、ディープクローンはデータとメタデータをコピーするため、作成にコストがかかります。

  • そのパスにすでにテーブルがあるターゲットに replace を使用してクローンを作成すると、そのパスに Delta ログが存在しない場合にログが作成されます。 既存のデータは、 vacuumを実行してクリーンアップできます。

  • 既存の Delta テーブルの場合、ソース テーブルの新しいメタデータと新しいデータを含む新しいコミットが作成されます。 この新しいコミットはインクリメンタルであり、最後のクローン以降の新しい変更のみがテーブルにコミットされます。

  • テーブルのクローン作成は、 Create Table As SelectCTASと同じではありません。 クローンは、データに加えてソース表のメタデータをコピーします。 クローン作成の構文も単純で、パーティション分割、形式、不変条件、null 許容などはソース テーブルから取得されるため、指定する必要はありません。

  • クローンテーブルには、ソーステーブルから独立した履歴があります。 クローンテーブルのタイムトラベルクエリーは、ソーステーブルと同じ入力では機能しません。

クローン構文 の例

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

CREATE TABLE delta.`/data/target/` CLONE delta.`/data/source/` -- Create a deep clone of /data/source at /data/target

CREATE OR REPLACE TABLE db.target_table CLONE db.source_table -- Replace the target

CREATE TABLE IF NOT EXISTS delta.`/data/target/` CLONE db.source_table -- No-op if the target table exists

CREATE TABLE db.target_table SHALLOW CLONE delta.`/data/source`

CREATE TABLE db.target_table SHALLOW CLONE delta.`/data/source` VERSION AS OF version

CREATE TABLE db.target_table SHALLOW CLONE delta.`/data/source` 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.forPath(spark, "/path/to/table")  # path-based tables, or
deltaTable = DeltaTable.forName(spark, "source_table")    # Hive metastore-based tables

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.forPath(spark, "/path/to/table")
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 メトリクス

CLONE 操作が完了すると、次のメトリクスが単一行 DataFrame として報告されます。

  • 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 権限が必要です。

クラウドプロバイダーの権限

ディープクローンを作成した場合、ディープクローンを読み取るすべてのユーザーは、クローンのディレクトリへの読み取りアクセス権を持っている必要があります。 クローンに変更を加えるには、ユーザーはクローンのディレクトリへの書き込みアクセス権を持っている必要があります。

シャロークローンを作成した場合、データファイルはシャロークローンを含むソーステーブルとクローンのディレクトリに残るため、シャロークローンを読み取るユーザーには元のテーブル内のファイルを読み取る権限が必要です。 クローンに変更を加えるには、クローンのディレクトリへの書き込みアクセス権が必要です。

データアーカイブ にクローンを使用する

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

-- Every month run
CREATE OR REPLACE TABLE delta.`/some/archive/path` CLONE my_prod_table

機械学習モデルの再現 にクローンを使用する

機械学習を実行するときに、ML モデルをトレーニングしたテーブルの特定のバージョンをアーカイブしたい場合があります。 将来のモデルは、このアーカイブされたデータセットを使用してテストできます。

-- Trained model on version 15 of Delta table
CREATE TABLE delta.`/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;

クローンを使用してテーブルのプロパティ を上書きする

Databricks Runtime 7.5 以降で使用できます。

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

  • 異なる部署とデータを共有するときに、所有者またはユーザーの情報でテーブルに注釈を付ける。

  • 差分テーブルとテーブル履歴またはタイムトラベルのアーカイブが必要です。 アーカイブ表のデータ保持期間とログ保持期間を個別に指定できます。 例えば:

CREATE OR REPLACE TABLE archive.my_table CLONE prod.my_table
TBLPROPERTIES (
delta.logRetentionDuration = '3650 days',
delta.deletedFileRetentionDuration = '3650 days'
)
LOCATION 'xx://archive/my_table'
dt = DeltaTable.forName(spark, "prod.my_table")
tblProps = {
"delta.logRetentionDuration": "3650 days",
"delta.deletedFileRetentionDuration": "3650 days"
}
dt.clone('xx://archive/my_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("xx://archive/my_table", isShallow = false, replace = true, properties = tblProps)