本文为您介绍如何在MaxCompute进行添加、修改列或添加、删除分区的命令操作。

添加分区操作

语法格式
ALTER TABLE table_name ADD [IF NOT EXISTS] PARTITION partition_spec;
partition_spec:(partition_col1 = partition_col_value1, partition_col2 = partiton_col_value2, ...)

功能说明

为已存在的表新增分区。仅支持新增分区,不支持新增分区字段。

说明
  • 目前MaxCompute单表支持的分区数量上限为6万。
  • 对于多级分区的表,如果需要添加新的分区,必须指明全部的分区值。
参数说明
  • table_name:需要新增分区的表名称。
  • IF NOT EXISTS:如果未指定IF NOT EXISTS而同名的分区已存在,则返回报错。
  • partition_spec:新增的分区名称,分区名必须小写。
示例
--给表sale_detail添加分区,用来存储2013年12月杭州地区的销售记录。
alter table sale_detail add if not exists partition (sale_date='201312', region='hangzhou');

--给表sale_detail添加分区,用来存储2013年12月上海地区的销售记录。
alter table sale_detail add if not exists partition (sale_date='201312', region='shanghai');

--给表sale_detail添加分区,仅指定一个分区sale_date,出错返回。
alter table sale_detail add if not exists partition(sale_date='20111011');

-- 给表sale_detail添加分区,仅指定一个分区region,出错返回。
alter table sale_detail add if not exists partition(region='shanghai');

删除分区操作

语法格式
ALTER TABLE table_name DROP [IF EXISTS] PARTITION partition_spec;
partition_spec:(partition_col1 = partition_col_value1, partition_col2 = partiton_col_value2, ...)
参数说明
  • table_name:需要删除分区的表名称。
  • IF EXISTS:如果未指定IF EXISTS且分区不存在,则返回报错。
  • partition_spec:删除的分区名称,分区名必须小写。
示例
--从表sale_detail中删除2013年12月杭州分区的销售记录。
alter table sale_detail drop if exists partition(sale_date='201312',region='hangzhou'); 

添加列操作

语法格式
  • 添加列
    ALTER TABLE table_name ADD COLUMNS (col_name1 type1,col_name2 type2...);
  • 同时添加列和注释
    ALTER TABLE table_name ADD COLUMNS (col_name1 type1 comment 'XXX',col_name2 type2 comment 'XXX');
参数说明
  • table_name:需要新增列的表名称。添加的新列不支持指定顺序,默认在最后一列。
  • col_name, type ,comment:新增的列名称以及对应的数据类型和注释。

修改列名操作

语法格式
ALTER TABLE table_name CHANGE COLUMN old_col_name RENAME TO new_col_name;
参数说明
  • table_name:需要修改列名的表名称。
  • old_col_name:需要修改的列名称。old_col_name必须是已存在的列。
  • new_col_name:新的列名称。表中不能有名为new_col_name的列。

修改列的注释

语法格式
ALTER TABLE table_name CHANGE COLUMN col_name COMMENT comment_string;
参数说明
  • table_name:需要修改列名的表名称。
  • col_name:需要修改注释的列名称。col_name必须是已存在的列。
  • comment_string:修改后的注释信息。内容最长为1024字节。

同时修改列名及列注释

语法格式
ALTER TABLE table_name CHANGE COLUMN old_col_name new_col_name column_type COMMENT column_comment;
参数说明
  • table_name:需要修改列名以及注释的表名称。
  • old_col_name:需要修改注释的列名称。old_col_name必须是已存在的列。
  • new_col_name:新的列名称。表中不能有名为new_col_name的列。
  • column_type:列的数据类型。
  • column_comment:修改后的注释信息。内容最长为1024字节。

修改表、分区的更新时间

MaxCompute SQL提供TOUCH操作用来修改分区的LastDataModifiedTime。此操作会将分区的LastDataModifiedTime修改为当前时间。此时,MaxCompute会认为表或分区的数据有变动,生命周期的计算会重新开始。

语法格式
ALTER TABLE table_name TOUCH PARTITION(partition_col='partition_col_value', ...);
参数说明
  • table_name:需要修改更新时间的表名称。如果此表不存在,则返回报错。
  • partition_col='partition_col_value':需要修改更新时间的分区名称以及分区值。如果指定的分区以及分区值不存在,则返回报错。

修改分区值

MaxCompute SQL支持通过RENAME操作更改对应表的分区值。

语法格式
ALTER TABLE table_name PARTITION (partition_col1 = partition_col_value1, partition_col2 = partiton_col_value2, ...) 
RENAME TO PARTITION (partition_col1 = partition_col_newvalue1, partition_col2 = partiton_col_newvalue2, ...);
参数说明
  • table_name:需要修改分区值的表名称。如果此表不存在,则返回报错。
  • partition_col = partition_col_value:表的分区名称以及对应的分区值。
  • partition_col = partition_col_newvalue:表的分区名称和修改后新的分区值。
    说明
    • 不支持修改分区列列名,只能修改分区列对应的值。
    • 修改多级分区的一个或者多个分区值,多级分区的每一级的分区值都必须填写。

合并分区

MaxCompute SQL提供MERGE PARTITION对分区进行合并,即同一个表下多个分区数据合并成一个分区,同时删除被合并的分区维度的信息,把数据移动到指定分区。

  • 语法格式
    ALTER TABLE <tableName> MERGE [IF EXISTS] PARTITION(<predicate>) [, PARTITION(<predicate2>) ...] OVERWRITE PARTITION(<fullPartitionSpec>) [PURGE];
  • 语法说明
    • 如果分区不存在且没有指定IF EXISTS,则报错。
    • 如果指定IF EXISTS 后不存在满足MERGE条件的分区,则不生成新分区。
    • 如果运行过程中出现源数据被并发修改(包括INSERT,RENAME,DROP)时,即使指定IF EXISTS也会报错。
    • 不支持外表, 不支持SHARD表,对于CLUSTERED表合并后的分区文件会消除CLUSTERED属性。
    • 一次性合并分区数量限制:4000个。
  • 示例
    --表的分区和数据如下。
    odps@ jet_zwz>list partitions intpstringstringstring;
    
    ds=20181101/hh=00/mm=00
    ds=20181101/hh=00/mm=10
    ds=20181101/hh=10/mm=00
    ds=20181101/hh=10/mm=10
    
    OK
    odps@ jet_zwz>read intpstringstringstring;
    +------------+------------+------------+------------+
    | value      | ds         | hh         | mm         |
    +------------+------------+------------+------------+
    | 1          | 20181101   | 00         | 00         |
    | 1          | 20181101   | 00         | 10         |
    | 1          | 20181101   | 10         | 00         |
    | 1          | 20181101   | 10         | 10         |
    +------------+------------+------------+------------+
    
    --合并所有满足 hh='00' 的分区到 hh='00', mm='00' 中。
    odps@ jet_zwz>alter table intpstringstringstring merge partition(hh='00') overwrite partition(ds='20181101', hh='00', mm='00');
    
    ID = 20190404025755844g80qwa7a
    OK
    
    --查看合并后的分区。
    odps@ jet_zwz>list partitions intpstringstringstring;
    
    ds=20181101/hh=00/mm=00
    ds=20181101/hh=10/mm=00
    ds=20181101/hh=10/mm=10
    
    OK
    
    --合并前两个分区的数据已经合并到了一个分区中。
    odps@ jet_zwz>read intpstringstringstring;
    +------------+------------+------------+------------+
    | value      | ds         | hh         | mm         |
    +------------+------------+------------+------------+
    | 1          | 20181101   | 00         | 00         |
    | 1          | 20181101   | 00         | 00         |
    | 1          | 20181101   | 10         | 00         |
    | 1          | 20181101   | 10         | 10         |
    +------------+------------+------------+------------+
    						
    merge partitions允许指定多个谓词条件,例如如下语句,指定到具体分区下,合并剩余分区。
    odps@ jet_zwz>alter table intpstringstringstring merge if exists partition(ds='20181101', hh='00', mm='00'), partition(ds='20181101', hh='10', mm='00'),  partition(ds='20181101', hh='10', mm='10') overwrite partition(ds='20181101', hh='00', mm='00') purge;
    
    ID = 20190404034632854g431sqzt2
    OK
    
    odps@ jet_zwz>show partitions intpstringstringstring;
    
    ds=20181101/hh=00/mm=00
    
    OK