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:可选。源表的分区信息。格式为
(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); --向源表增加分区。 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; --查看复制后目标表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的信息,验证数据准确性。 --开启全表扫描,仅此Session有效。执行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。命令示例如下:
--复制表数据。 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 | +------------+-------------+-------------+------------+------------+
示例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跨项目数据迁移。