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

MaxCompute:CLONE TABLE

最終更新日:Dec 10, 2025

CLONE TABLE 文は、ソーステーブルから宛先テーブルにデータを効率的にコピーします。この機能は、データ移行シナリオで役立ちます。この Topic では、CLONE TABLE コマンドの使用方法の例を説明します。

制限事項

  • 宛先テーブルの制限

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

    • 宛先テーブルが存在する場合、一度に最大 10,000 個のパーティションからデータをコピーできます。

    • 宛先テーブルが存在しない場合、パーティションの数に制限はありません。これにより、原子性が保証されます。

  • 外部テーブルの制限CLONE TABLE コマンドを使用して、外部テーブルからデータをコピーすることはできません。

  • CLONE TABLE コマンドを使用して、パーティションテーブル、非パーティションテーブル、およびクラスター化テーブルのデータをコピーできます。

  • リージョン間の制限: 異なるリージョンにある MaxCompute プロジェクト間でデータをコピーする場合、CLONE TABLE コマンドは使用できません。

  • ストレージクラス間の制限

    CLONE TABLE コマンドを使用して、異なるストレージクラスを使用するプロジェクト間でデータをコピーすることはできません。 たとえば、CLONE TABLE コマンドを使用して、マルチ AZ ストレージを使用するプロジェクトのテーブルからシングル AZ ストレージを使用するプロジェクトにデータをコピーしたり、その逆のコピーを行ったりすることはできません。

  • 異なるストレージクラスを持つプロジェクト間でテーブルをコピーする場合の推奨方法:

    • 非パーティションテーブルの場合、CREATE TABLE AS 文を使用してデータを移行できます。

    • パーティションテーブルの場合は、まず CREATE TABLE LIKE 文を使用してテーブルを作成し、次に INSERT OVERWRITE 文を実行してデータを移行できます。

コマンド構文

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` のデータをクエリするには、次のコマンドを実行します:

    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
    );
    
    -- ソーステーブルにデータを追加します。
    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` への全データコピー

    -- テーブルデータをコピーします。
    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` へのデータコピー

    -- テーブルデータをコピーします。
    clone table sale_detail partition (sale_date='2013', region='china') to sale_detail_clone if exists overwrite;
    -- 宛先テーブル sale_detail_clone をクエリしてデータを確認します。
    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` から宛先テーブル `sale_detail_clone` (例 2 で生成されたテーブル) への全データコピー (既存パーティションはスキップ)

    -- テーブルデータをコピーします。
    clone table sale_detail to sale_detail_clone if exists ignore;
    -- 宛先テーブル sale_detail_clone をクエリしてデータを確認します。
    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` への全データコピー

    -- テーブルデータをコピーします。
    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   |
    +------------+-------------+-------------+------------+------------+