
# 添加分区
#### 功能描述
为已存在的OBS分区表添加一个或多个分区。该命令将分区元数据信息注册到元数据库中，使后续查询可以按分区列进行数据检索。
OBS分区表生成分区信息主要有以下两种场景：
- 向OBS分区表插入对应的分区数据，数据插入成功后自动生成分区元数据信息。
- 手动拷贝分区目录和数据到OBS分区表路径下，再执行本命令添加分区元数据信息。
 
#### 语法格式
```
ALTER TABLE table_name ADD [IF NOT EXISTS]
  PARTITION partition_specs1 [LOCATION 'location_path1']
  PARTITION partition_specs2 [LOCATION 'location_path2']
  ...;
```
#### 参数说明
| **参数**              | **描述**                                                               |
|:---|:---|
| **table_name**      | 表名称。                                                                 |
| **IF NOT EXISTS**   | 可选关键字。指定该关键字后，若分区已存在则不会报错，静默跳过。                                      |
| **partition_specs** | 分区规格，格式为 (col1=val1, col2=val2, ...)。若表有多个分区列，添加分区时需指定所有分区列的值，顺序可任意。 |
| **location_path**   | 可选。分区的存储路径。若指定，该路径必须已存在，否则会报错。                                       |
   
#### 注意事项
- 向表中添加分区时，此表和分区列（建表时 PARTITIONED BY 指定的列）必须已存在，而所要添加的分区不能重复添加，否则将出错。已添加的分区可通过 IF NOT EXISTS 避免报错。
- 若分区表是按照多个字段进行分区的，添加分区时需要指定所有的分区字段，指定字段的顺序可任意。
- partition_specs 中的参数默认带有 ( )，例如：PARTITION (dt='2009-09-09', city='xxx')。
- 在添加分区时若指定路径，则该路径必须是已经存在的，否则会出错。
- 若添加多个分区，每组 PARTITION partition_specs LOCATION 'location_path' 之间用空格隔开。
- 若新增分区指定的路径包含子目录（或嵌套子目录），则子目录下面的所有文件类型及内容也将作为该分区的记录。需要保证该分区目录下所有文件类型和文件内容与表的字段一致，否则查询将报错。
 
#### 示例1：添加单个分区
为表 student 添加一个分区，分区列为 facultyNo=10, classNo=101。
```
ALTER TABLE student ADD
   PARTITION (facultyNo=10, classNo=101);
```
#### 示例2：添加多个分区
为表 student 同时添加两个分区。
```
ALTER TABLE student ADD
   PARTITION (facultyNo=10, classNo=101)
   PARTITION (facultyNo=20, classNo=102);
```
#### 示例3：使用 IF NOT EXISTS 添加分区
添加分区时使用 IF NOT EXISTS 避免分区已存在时报错。
```
ALTER TABLE student ADD IF NOT EXISTS
   PARTITION (facultyNo=10, classNo=101);
```
#### 示例4：添加分区并指定 LOCATION
为OBS表添加分区，并指定分区数据的存储路径。
```
ALTER TABLE testobstable ADD
   PARTITION (external_data='22')
   LOCATION 'obs://bucketName/datapath/external_data=22';
```
