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

MaxCompute:テーブルのクローン

最終更新日:Apr 29, 2025

CLONE TABLE 文は、ソーステーブルのデータをターゲットテーブルに効率的にコピーすることをサポートしており、テーブルデータの移行シナリオに適しています。このトピックでは、CLONE TABLE 文を使用する方法の例を示します。

制限事項

  • コピー先テーブルのスキーマは、コピー元テーブルのスキーマと互換性がある必要があります。

  • パーティションテーブル、非パーティションテーブル、およびクラスタテーブルに対して CLONE TABLE 文を実行できます。

  • CLONE TABLE 文を実行する前にコピー先テーブルを作成した場合、最大 10,000 個のパーティションから同時にデータをクローンできます。

  • CLONE TABLE 文を実行する前にコピー先テーブルを作成していない場合、同時にデータをクローンできるパーティションの数に制限はありません。このようにして、クローン操作の原子性が保証されます。

  • CLONE TABLE 文は、リージョンまたはクラスターをまたがる MaxCompute プロジェクト間(プロジェクト O&M 移行中)でテーブルデータを複製するために使用することはできません。

  • CLONE TABLE 文は、外部テーブルのテーブルデータを複製するために使用することはできません。

  • 列の追加や削除などのスキーマ進化が行われたテーブルでは、CLONE 操作はサポートされていません。

構文

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 プロジェクトの名前。このパラメーターを設定しない場合、現在のプロジェクトの名前が使用されます。ソーステーブルとコピー先テーブルが同じ MaxCompute プロジェクトに属していない場合は、このパラメーターが必要です。

  • src_table_name: 必須。ソーステーブルの名前。

  • pt_spec: オプション。ソーステーブルのパーティション情報。このパラメーターの値は、(partition_col1 = partition_col_value1, partition_col2 = partition_col_value2, ...) 形式です。partition_col は列名を指定し、partition_col_value は列値を指定します。

  • dest_project_name: オプション。コピー先テーブルが属する MaxCompute プロジェクトの名前。このパラメーターを設定しない場合、現在のプロジェクトの名前が使用されます。ソーステーブルとコピー先テーブルが同じ MaxCompute プロジェクトに属していない場合は、このパラメーターが必要です。

  • dest_table_name: 必須。コピー先のテーブルの名前。

    • 宛先テーブルを作成していない場合、CLONE TABLE 文は CREATE TABLE LIKE 文の構文を使用して宛先テーブルを作成します。 CREATE TABLE LIKE 文の詳細については、「テーブルを作成する」をご参照ください。

    • 宛先テーブルを作成済みで、IF EXISTS OVERWRITE を指定した場合、CLONE TABLE 文は宛先テーブルのデータ、または宛先テーブルの指定されたパーティションのデータを上書きします。

    • 宛先テーブルを作成済みで、IF EXISTS IGNORE を指定した場合、CLONE TABLE 文は既存のパーティションをスキップし、宛先テーブルの既存のパーティションのデータを上書きしません。

サンプルデータ

このトピックの例をより理解するために、サンプルのソースデータが提供されています。次の文は、sale_detail という名前のパーティションテーブルと sale_detail_np という名前の非パーティションテーブルを作成し、テーブルにデータを挿入する方法を示しています。

  • sale_detail テーブル

    -- 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);
    
    -- sale_detail テーブルにパーティションを追加します。
    ALTER TABLE sale_detail ADD PARTITION (sale_date='2013', region='china') PARTITION (sale_date='2014', region='shanghai');
    
    -- sale_detail テーブルにデータを挿入します。
    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);

    sale_detail テーブルのデータをクエリします。サンプル文:

    -- 現在のセッションに対してのみ全表スキャンを有効にします。SELECT 文を実行して、sale_detail テーブルのデータを表示します。
    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 テーブル

    -- sale_detail_np という名前の非パーティションテーブルを作成します。
    CREATE TABLE IF NOT EXISTS sale_detail_np
    (
    shop_name     string,
    customer_id   string,
    total_price   double
    );
    
    -- sale_detail_np テーブルにデータを挿入します。
    INSERT INTO sale_detail_np VALUES ('s4','c4',100.4);

    sale_detail_np テーブルのデータをクエリします。サンプル文:

    SELECT * FROM sale_detail_np;

    次の結果が返されます。

    -- 次の結果が返されます。
    +------------+-------------+-------------+
    | shop_name  | customer_id | total_price |
    +------------+-------------+-------------+
    | s4         | c4          | 100.4       |
    +------------+-------------+-------------+

このセクションでは、サンプルデータに基づいて CLONE TABLE 文を使用する方法の例を示します。

  • 例 1: sale_detail_np テーブルから sale_detail_np_clone テーブルにすべてのデータをクローンします。サンプル文:

    -- sale_detail_np テーブルから sale_detail_np_clone テーブルにすべてのデータをクローンします。
    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: sale_detail テーブルの指定されたパーティションから sale_detail_clone テーブルにデータをクローンします。サンプル文:

    -- sale_detail テーブルの指定されたパーティションから sale_detail_clone テーブルにデータをクローンします。
    CLONE TABLE sale_detail PARTITION (sale_date='2013', region='china') TO sale_detail_clone IF EXISTS OVERWRITE;
    -- sale_detail_clone テーブルのデータをクエリして、データの精度を確認します。
    SET odps.sql.allow.fullscan=true;
    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 テーブルから例 2 で作成された sale_detail_clone テーブルにすべてのデータをクローンし、sale_detail_clone テーブルの既存のパーティションをスキップします。サンプル文:

    -- sale_detail テーブルから sale_detail_clone テーブルにすべてのデータをクローンします。
    CLONE TABLE sale_detail TO sale_detail_clone IF EXISTS IGNORE;
    -- sale_detail_clone テーブルのデータをクエリして、データの精度を確認します。
    -- 現在のセッションに対してのみ全表スキャンを有効にします。SELECT 文を実行して、sale_detail テーブルのデータを表示します。
    SET odps.sql.allow.fullscan=true; 
    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: sale_detail テーブルから sale_detail_clone1 テーブルにすべてのデータをクローンします。サンプル文:

    -- sale_detail テーブルから sale_detail_clone1 テーブルにすべてのデータをクローンします。
    CLONE TABLE sale_detail TO sale_detail_clone1;
    -- sale_detail_clone1 テーブルのデータをクエリして、データの精度を確認します。
    SET odps.sql.allow.fullscan=true; 
    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 テーブルからデータをクローンする

      CLONE TABLE mf_dt TO new_table;
    • パーティション Delta テーブルからデータをクローンする

      CLONE TABLE mf_dt2 PARTITION (dd='01', hh='01') TO new_table;

ベストプラクティス

同じリージョン内の MaxCompute プロジェクト間でデータを移行する方法の詳細については、「CLONE TABLE を使用して同じリージョン内の MaxCompute プロジェクト間でデータを移行する」をご参照ください。