大數據

MaxCompute – ODPS 新功能 – CLONE TABLE

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

 

相关链接:

  1. 用户文档:http://help.aliyun-inc.com/internaldoc/detail/146424.html
  2. 实现细节:https://yuque.antfin-inc.com/docs/share/22b6b077-e45b-48ce-8637-f85d8e683fb1
  3. 测试细节:https://yuque.antfin-inc.com/docs/share/7acdbd98-1d74-4773-97e6-9b5ac3aee351

 

CLONE TABLE 已在弹内上线,欢迎大家试用。

Leave a Reply

Your email address will not be published. Required fields are marked *