
# 添加分区（只支持OBS表）
#### 功能描述
创建OBS分区表成功后，OBS表实际还没有生成分区信息。生成分区信息主要有以下两种场景：
- 给OBS分区表插入对应的分区数据，数据插入成功后OBS表才会生成分区元数据信息，后续则可以根据对应分区列进行查询等操作。
- 手工拷贝分区目录和数据到OBS分区表路径下，执行本章节介绍的分区添加命令生成分区元数据信息，后续即可根据对应分区列进行查询等操作。
本章节重点介绍使用**ALTER TABLE**命令添加分区的基本操作和使用说明。
#### 语法格式
```
ALTER TABLE table_name ADD [IF NOT EXISTS]
  PARTITION partition_specs1
  [LOCATION 'obs_path1']
  PARTITION partition_specs2
  [LOCATION 'obs_path2'];
```
#### 关键字
- IF NOT EXISTS：指定该关键字以避免分区重复添加时报错。
- PARTITION：分区。
- LOCATION：分区路径。
 
#### 参数说明
表1参数描述 
| **参数**          | **描述**   |
|:---|:---|
| table_name      | 表名称。     |
| partition_specs | 分区字段。    |
| obs_path        | OBS存储路径。 |
   
#### 注意事项
- 向表中添加分区时，此表和分区列（建表时PARTITIONED BY指定的列）必须已存在，而所要添加的分区不能重复添加，否则将出错。已添加的分区可通过IF NOT EXISTS避免报错。
- 若分区表是按照多个字段进行分区的，添加分区时需要指定所有的分区字段，指定字段的顺序可任意。
- "partition_specs"中的参数默认带有"( )"。例如：PARTITION (dt='2009-09-09',city='xxx')。
- 在添加分区时若指定OBS路径，则该OBS路径必须是已经存在的，否则会出错。
- 若添加多个分区，每组PARTITION partition_specs LOCATION 'obs_path'之间用空格隔开。例如： PARTITION partition_specs LOCATION 'obs_path' PARTITION partition_specs LOCATION 'obs_path'。
  
- 若新增分区指定的路径包含子目录（或嵌套子目录），则子目录下面的所有文件类型及内容也将作为该分区的记录。 您需要保证该分区目录下所有文件类型和文件内容与表的字段一致，否则查询将报错。
  您可以在建表语句OPTIONS中设置"multiLevelDirEnable"为true以查询子目录下的内容，此参数默认值为false（注意，此配置项为表属性，请谨慎配置。Hive表不支持此配置项)。
  
 
#### 示例
- 建OBS表时仅有**一个分区列** ，建表成功后添加分区数据。
  1. 先使用DataSource语法创建一个OBS分区表，分区列为external_data，数据存储在obs://bucketName/datapath路径下。
     ```
     create table testobstable(id varchar(128), external_data varchar(16)) using JSON OPTIONS (path 'obs://bucketName/datapath') PARTITIONED by (external_data);
     ```
     
  
  2. 拷贝分区数据目录到obs://bucketName/datapath路径下。例如当前拷贝external_data=22的分区目录下所有文件到obs://bucketName/datapath路径下。
  
  3. 执行添加分区命令，将分区的元数据信息生效。
     ```
     ALTER TABLE testobstable ADD
       PARTITION (external_data='22')
       LOCATION 'obs://bucketName/datapath/external_data=22';
     ```
     
  
  4. 添加分区成功后，即可根据分区列进行数据查询等操作。
     ```
     select * from testobstable where external_data='22';
     ```
     
   
- 建OBS表时有**多个分区列** ，建表成功后添加分区数据。
  1. 先使用DataSource语法创建一个OBS分区表，分区列为external_data和dt，数据存储在obs://bucketName/datapath路径下。
     ```
     create table testobstable(
       id varchar(128),
       external_data varchar(16),
       dt varchar(16)
     ) using JSON OPTIONS (path 'obs://bucketName/datapath') PARTITIONED by (external_data, dt);
     ```
     
  
  2. 拷贝分区数据目录到obs://bucketName/datapath路径下。例如拷贝external_data=22及其子目录dt=2021-07-27和目录下文件到obs://bucketName/datapath路径下。
  
  3. 执行添加分区命令，将分区的元数据信息生效。
     ```
     ALTER TABLE
       testobstable
     ADD
       PARTITION (external_data = '22', dt = '2021-07-27') LOCATION 'obs://bucketName/datapath/external_data=22/dt=2021-07-27';
     ```
     
  
  4. 添加分区成功后，即可根据分区列进行数据查询等操作。
     ```
     select * from testobstable where external_data = '22';
     select * from testobstable where external_data = '22' and dt='2021-07-27';
     ```
     
   
 
