すべてのプロダクト
Search
ドキュメントセンター

MaxCompute:CLONE TABLE

最終更新日:Jun 26, 2026

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

パラメーター:

パラメーター

必須

説明

src_project_name

いいえ

ソーステーブルを含む MaxCompute プロジェクト。デフォルトは現在のプロジェクトです。ソーステーブルとターゲットテーブルが異なるプロジェクトにある場合は必須です。

src_table_name

はい

ソーステーブルの名前。

pt_spec

いいえ

コピーするパーティション。形式: partition_col1 = partition_col_value1, partition_col2 = partition_col_value2, ...

dest_project_name

いいえ

ターゲットテーブルを含む MaxCompute プロジェクト。デフォルトは現在のプロジェクトです。ソーステーブルとターゲットテーブルが異なるプロジェクトにある場合は必須です。

dest_table_name

はい

ターゲットテーブルの名前。動作については下記の表をご参照ください。

ターゲットテーブルの動作:

条件

動作

ターゲットテーブルが存在しない

CREATE TABLE LIKE のセマンティクスに従ってテーブルを作成し、その後データをコピーします。詳細については、「テーブルの作成」をご参照ください。

ターゲットテーブルが存在する + IF EXISTS OVERWRITE

ターゲットテーブルまたは指定されたパーティション内のデータを上書きします。

ターゲットテーブルが存在する + IF EXISTS IGNORE

既存のパーティションをスキップし、そのデータを上書きしません。

サンプルデータ

以下の例では、2 つのサンプルテーブルを使用します。次のコマンドを実行してテーブルを作成し、データを挿入してください。

パーティションテーブル: sale_detail

  1. パーティションテーブルを作成します。

    -- パーティションテーブルの作成
    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);
  2. テーブルをクエリして確認します。

    SET odps.sql.allow.fullscan=true;
    SELECT * FROM sale_detail;

    結果を表示

    期待される出力:

    +------------+-------------+-------------+------------+------------+
    | 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   |
    +------------+-------------+-------------+------------+------------+

非パーティションテーブル: sale_detail_np

  1. 非パーティションテーブルを作成します。

    -- 非パーティションテーブルの作成
    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);
  2. テーブルをクエリして確認します。

    SELECT * FROM sale_detail_np;

    結果を表示

    期待される出力:

    +------------+-------------+-------------+
    | shop_name  | customer_id | total_price |
    +------------+-------------+-------------+
    | s4         | c4          | 100.4       |
    +------------+-------------+-------------+

例 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 プロジェクト間でのデータ移行」をご参照ください。