CLONE TABLE は、ソーステーブルからターゲットテーブルへデータをコピーします。このコマンドを使用して、同一リージョン内かつ同一ストレージクラスにある、同一または異なる MaxCompute プロジェクトのテーブル間でデータを移行できます。
制限事項
スキーマの互換性: ターゲットテーブルのスキーマは、ソーステーブルのスキーマと互換性がある必要があります。
パーティションコピーの制限:
既存のターゲットテーブルにコピーする場合、一度に最大 10,000 個のパーティションをコピーできます。
ターゲットテーブルが存在しない場合、パーティション数の制限はなく、操作はアトミックに実行されます。
サポートされるテーブルタイプ:
PK/Append Delta テーブル:
既存の Delta テーブルは上書きできません。
CLONE TABLEを使用して新しい Delta テーブルのみを作成できます。通常のテーブル (パーティションテーブル、非パーティションテーブル、クラスタ化テーブル)。
トランザクションテーブル:
既存のトランザクションテーブルは上書きできません。
CLONE TABLEを使用して新しいトランザクションテーブルのみを作成できます。
外部テーブル:
CLONE TABLEは外部テーブルからデータをコピーできません。行レベルのアクセス制御またはデータマスキング:
CLONE TABLEは、行アクセスポリシーまたはデータマスキングポリシーが適用されているテーブルには使用できません。クロスリージョン:
CLONE TABLEは、異なるリージョンまたはクラスタにある MaxCompute プロジェクト間 (プロジェクトの運用保守移行時を含む) ではデータをコピーできません。ストレージクラスをまたぐコピー:
CLONE TABLEは、異なるストレージクラスを使用するプロジェクト間 (例:マルチ AZ ストレージプロジェクトからシングル AZ ストレージプロジェクトへ、またはその逆) ではデータをコピーできません。異なるストレージクラスのプロジェクト間でデータを移行するには、次の代替手段を使用してください。
非パーティションテーブル:
CREATE TABLE ASを使用してデータを移行します。パーティションテーブル:
CREATE TABLE LIKEを使用してテーブルを作成し、その後INSERT OVERWRITEを使用してデータを移行します。
スキーマエボリューション:
CLONE TABLEは、スキーマエボリューション (列の追加や削除など) が行われたテーブルには使用できません。
課金
CLONE TABLE はメタデータに基づく操作であり、コンピューティングコストは発生しません。複製されたターゲットテーブルは、実際のストレージ使用量に基づいて課金されます。
構文
CLONE TABLE [<src_project_name>.]<src_table_name> [PARTITION (<pt_spec>), ...]
TO [<dest_project_name>.]<dest_table_name> [IF EXISTS [OVERWRITE | IGNORE]];パラメーター:
パラメーター | 必須 | 説明 |
| いいえ | ソーステーブルを含む MaxCompute プロジェクト。デフォルトは現在のプロジェクトです。ソーステーブルとターゲットテーブルが異なるプロジェクトにある場合は必須です。 |
| はい | ソーステーブルの名前。 |
| いいえ | コピーするパーティション。形式: |
| いいえ | ターゲットテーブルを含む MaxCompute プロジェクト。デフォルトは現在のプロジェクトです。ソーステーブルとターゲットテーブルが異なるプロジェクトにある場合は必須です。 |
| はい | ターゲットテーブルの名前。動作については下記の表をご参照ください。 |
ターゲットテーブルの動作:
条件 | 動作 |
ターゲットテーブルが存在しない |
|
ターゲットテーブルが存在する + | ターゲットテーブルまたは指定されたパーティション内のデータを上書きします。 |
ターゲットテーブルが存在する + | 既存のパーティションをスキップし、そのデータを上書きしません。 |
サンプルデータ
以下の例では、2 つのサンプルテーブルを使用します。次のコマンドを実行してテーブルを作成し、データを挿入してください。
パーティションテーブル: sale_detail
パーティションテーブルを作成します。
-- パーティションテーブルの作成 CREATE TABLE IF NOT EXISTS sale_detail ( shop_name STRING, customer_id STRING, total_price DOUBLE ) PARTITIONED BY (sale_date STRING, region STRING); -- パーティションの追加 ALTER TABLE sale_detail ADD PARTITION (sale_date='2013', region='china') PARTITION (sale_date='2014', region='shanghai'); -- データの挿入 INSERT INTO sale_detail PARTITION (sale_date='2013', region='china') VALUES ('s1','c1',100.1),('s2','c2',100.2),('s3','c3',100.3); INSERT INTO sale_detail PARTITION (sale_date='2014', region='shanghai') VALUES ('null','c5',null),('s6','c6',100.4),('s7','c7',100.5);テーブルをクエリして確認します。
SET odps.sql.allow.fullscan=true; SELECT * FROM sale_detail;
非パーティションテーブル: sale_detail_np
非パーティションテーブルを作成します。
-- 非パーティションテーブルの作成 CREATE TABLE IF NOT EXISTS sale_detail_np ( shop_name STRING, customer_id STRING, total_price DOUBLE ); -- データの挿入 INSERT INTO sale_detail_np VALUES ('s4','c4',100.4);テーブルをクエリして確認します。
SELECT * FROM sale_detail_np;
例
例 1: 非パーティションテーブルから新しいテーブルへのコピー
CLONE TABLE sale_detail_np TO sale_detail_np_clone; -- sale_detail_np_clone を作成し、すべてのデータをコピー
SELECT * FROM sale_detail_np_clone;期待される出力:
+------------+-------------+-------------+
| shop_name | customer_id | total_price |
+------------+-------------+-------------+
| s4 | c4 | 100.4 |
+------------+-------------+-------------+例 2: 特定パーティションから既存テーブルへのコピー
CLONE TABLE sale_detail PARTITION (sale_date='2013', region='china')
TO sale_detail_clone IF EXISTS OVERWRITE; -- 2013/china パーティションのみをコピー。パーティションが存在する場合は上書き
SELECT * FROM sale_detail_clone;期待される出力:
+------------+-------------+-------------+------------+------------+
| shop_name | customer_id | total_price | sale_date | region |
+------------+-------------+-------------+------------+------------+
| s1 | c1 | 100.1 | 2013 | china |
| s2 | c2 | 100.2 | 2013 | china |
| s3 | c3 | 100.3 | 2013 | china |
+------------+-------------+-------------+------------+------------+例 3: 既存パーティションを無視した全パーティションのコピー
この例は、前の例の続きです。sale_detail_clone には、すでに 2013/china パーティションが含まれています。IF EXISTS IGNORE オプションは、既存のパーティションには触れずに、残りのパーティションをコピーします。
CLONE TABLE sale_detail TO sale_detail_clone IF EXISTS IGNORE; -- 新しいパーティションを追加。既存のパーティションはスキップ
SELECT * FROM sale_detail_clone;期待される出力:
+------------+-------------+-------------+------------+------------+
| shop_name | customer_id | total_price | sale_date | region |
+------------+-------------+-------------+------------+------------+
| s1 | c1 | 100.1 | 2013 | china |
| s2 | c2 | 100.2 | 2013 | china |
| s3 | c3 | 100.3 | 2013 | china |
| null | c5 | NULL | 2014 | shanghai |
| s6 | c6 | 100.4 | 2014 | shanghai |
| s7 | c7 | 100.5 | 2014 | shanghai |
+------------+-------------+-------------+------------+------------+例 4: 全パーティションから新しいテーブルへのコピー
CLONE TABLE sale_detail TO sale_detail_clone1; -- sale_detail_clone1 を作成し、すべてのパーティションをアトミックにコピー
SELECT * FROM sale_detail_clone1;期待される出力:
+------------+-------------+-------------+------------+------------+
| shop_name | customer_id | total_price | sale_date | region |
+------------+-------------+-------------+------------+------------+
| s1 | c1 | 100.1 | 2013 | china |
| s2 | c2 | 100.2 | 2013 | china |
| s3 | c3 | 100.3 | 2013 | china |
| null | c5 | NULL | 2014 | shanghai |
| s6 | c6 | 100.4 | 2014 | shanghai |
| s7 | c7 | 100.5 | 2014 | shanghai |
+------------+-------------+-------------+------------+------------+例 5: Delta テーブルのクローン作成
非パーティション Delta テーブルのクローン作成
-- 非パーティション Delta テーブルの作成 CREATE TABLE IF NOT EXISTS sale_detail_delta ( shop_name STRING, customer_id STRING, total_price DOUBLE ) TBLPROPERTIES ("table.format.version"="2"); INSERT INTO sale_detail_delta VALUES ('s1','c1',100.1),('s2','c2',100.2); -- クローン作成の例 CLONE TABLE sale_detail_delta TO sale_detail_delta_clone;パーティション Delta テーブルのクローン作成
-- パーティション Delta テーブルの作成 CREATE TABLE IF NOT EXISTS sale_detail_delta_pt ( shop_name STRING, customer_id STRING, total_price DOUBLE ) PARTITIONED BY (dd STRING, hh STRING) TBLPROPERTIES ("table.format.version"="2"); INSERT INTO sale_detail_delta_pt PARTITION (dd='01', hh='01') VALUES ('s3','c3',100.3); -- クローン作成の例 CLONE TABLE sale_detail_delta_pt PARTITION (dd='01', hh='01') TO sale_detail_delta_pt_clone;
ベストプラクティス
同一リージョン内の MaxCompute プロジェクト間でのデータ移行については、「CLONE TABLE を使用した、同一リージョン内 MaxCompute プロジェクト間でのデータ移行」をご参照ください。