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