MaxCompute SQL提供CLONE TABLE
快速复制 表/分区 数据到另一个表中。
场景
1.数据迁移:由于之前资源规划不满足(或者 BU架构调整,需要拆分Project)我需要把一个ODPS Project中的表大量迁移到另一个Project中,但是跨Project 没法 rename table,使用create table as select * 速度太慢,成本太高。
2.数据备份:我想把我的表快速备份一份快照,然后在对它进行操作,避免误操作。
3.快速复制数据:我想跑一个单纯复制数据的作业,把表A部分分区的数据复制到表B的分区中,希望能快速完成。
如 insert overwrite table B partition(pt='1') select * from A partition(pt='1');
以上的几种场景可以使用 CLONE TABLE 非常好的解决。
功能简介
语法:
CLONE TABLE <[src_project_name.]src_table_name> [PARTITION(spec), ...] TO <[dest_project_name.]desc_table_name> [IF EXISTS (OVERWRITE | IGNORE)] ;
1.语法说明:
- 当目标表不存在,CLONE TABLE会创建目标表(create table like语义)。
- 当目标表已存在并指定 IF EXISTS OVERWRITE,则覆盖目标表对应分区数据。
- 当目标表已存在并指定 IF EXISTS IGNORE 则不会覆盖目标表已有分区。
2.限制项与报错处理:
- 目标表要求与源表schema兼容。
- 支持分区表和非分区表。不支持clustered table,xlib,shard,algo,极限存储等特殊数据组织结构表。 (如果有特殊表结构 CLONE TABLE的明确需求可以提给我们)
- 要求源表和目标表复制集群配置相交,并且当前数据在一个集群里,否则报错。 (如果有 CLONE TABLE 主动触发跨集群复制需求可以提给我们 )
- 目标表已存在时一次性分区复制数量限制 10000个。
- 目标表不存在时无分区数量限制,满足原子性。
- 遇到Pangu Hardlink报错时, 则可以purge 回收站后, 再重试。报错中有提示如何清理。
- CLONE TABLE不会保留源表上的权限数据。
示例:
#源表的分区和数据如下
odps@ multi>read srcpart_copy;
+------------+------------+------------+------------+
| key | value | ds | hr |
+------------+------------+------------+------------+
| 1 | ok49 | 2008-04-09 | 11 |
| 1 | ok48 | 2008-04-08 | 12 |
+------------+------------+------------+------------+
odps@ multi>read src_copy;
+------------+------------+
| key | value |
+------------+------------+
| 1 | ok |
+------------+------------+
#全量创建并复制非分区表
clone table src_copy to src_clone;
odps@ multi>clone table src_copy to src_clone;
ID = 2019102303024544g2540cdv2
OK
odps@ multi>read src_clone;
+------------+------------+
| key | value |
+------------+------------+
| 1 | ok |
+------------+------------+
#部分复制分区表
clone table srcpart_copy partition(ds="2008-04-09", hr='11') to srcpart_clone IF EXISTS OVERWRITE;
odps@ multi>clone table srcpart_copy partition(ds="2008-04-09", hr='11') to srcpart_clone IF EXISTS OVERWRITE;
ID = 20191023030534986g4540cdv2
OK
odps@ multi>read srcpart_clone;
+------------+------------+------------+------------+
| key | value | ds | hr |
+------------+------------+------------+------------+
| 1 | ok49 | 2008-04-09 | 11 |
+------------+------------+------------+------------+
#完整复制分区表并跳过已存在的分区 (注意:并发提交SQL的场景下,可能会覆盖一个CLONE TABLE启动后被其他作业新增的分区)
clone table srcpart_copy to srcpart_clone IF EXISTS IGNORE;
odps@ multi>clone table srcpart_copy to srcpart_clone IF EXISTS IGNORE;
ID = 20191023030619196g5540cdv2
OK
odps@ multi>read srcpart_clone;
+------------+------------+------------+------------+
| key | value | ds | hr |
+------------+------------+------------+------------+
| 1 | ok49 | 2008-04-09 | 11 |
| 1 | ok48 | 2008-04-08 | 12 |
+------------+------------+------------+------------+
#完整创建并复制分区表
clone table srcpart_copy to srcpart_clone2;
odps@ multi>clone table srcpart_copy to srcpart_clone2;
ID = 20191023030825186g6540cdv2
OK
odps@ multi>read srcpart_clone2;
+------------+------------+------------+------------+
| key | value | ds | hr |
+------------+------------+------------+------------+
| 1 | ok49 | 2008-04-09 | 11 |
| 1 | ok48 | 2008-04-08 | 12 |
+------------+------------+------------+------------+
相关链接:
- 用户文档:http://help.aliyun-inc.com/internaldoc/detail/146424.html
- 实现细节:https://yuque.antfin-inc.com/docs/share/22b6b077-e45b-48ce-8637-f85d8e683fb1
- 测试细节:https://yuque.antfin-inc.com/docs/share/7acdbd98-1d74-4773-97e6-9b5ac3aee351
CLONE TABLE 已在弹内上线,欢迎大家试用。