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