CLONE TABLE支持高效地將源表數據復制到目標表中,適用于表數據遷移場景。本文以具體示例為您介紹CLONE TABLE
功能的使用。
使用限制
目標表與源表的Schema需要兼容。
支持分區表和非分區表,支持對聚簇表使用
CLONE TABLE
命令復制表數據。目標表已存在時,一次性復制分區的數量上限為10000個。
目標表不存在時,無分區數量限制,滿足原子性。
不支持在跨地域的MaxCompute項目之間使用
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項目名稱。不指定時,默認為當前項目。當源表與目標表不屬于同一個MaxCompute項目時,需要攜帶此參數。 |
src_table_name | 是 | 源表名稱。 |
pt_spec | 否 | 源表的分區信息。格式為: |
dest_project_name | 否 | 目標表所屬MaxCompute項目名稱。不指定時,默認為當前項目。當目標表與源表不屬于同一個MaxCompute項目時,需要攜帶此參數。 |
dest_table_name | 是 | 目標表名稱。
|
示例數據
為便于理解,本文為您提供源數據,基于源數據提供相關示例。創建分區表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); --向源表增加分區。 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);
查詢分區表sale_detail中的數據,命令示例如下:
--開啟全表掃描,僅此Session有效。執行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 ); --向源表追加數據。 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; --開啟全表掃描,執行select語句查看復制后目標表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的數據至目標表sale_detail_clone(示例2已生成的表)并跳過目標表中已存在的分區。命令示例如下:
--復制表數據。 CLONE TABLE sale_detail TO sale_detail_clone IF EXISTS IGNORE; --查看復制后目標表sale_detail_clone的信息,驗證數據準確性。 --開啟全表掃描,僅此Session有效。執行select語句查看表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 | | 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; --開啟全表掃描,執行select語句查看復制后目標表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 Table表
克隆Delta Table非分區表
CLONE TABLE mf_dt TO new_table;
克隆Delta Table分區表
CLONE TABLE mf_dt2 PARTITION (dd='01', hh='01') TO new_table;
最佳實踐
實現同Region的MaxCompute項目數據遷移請參見使用CLONE TABLE實現同地域MaxCompute跨項目數據遷移。