
# 指定筛选条件删除分区（只支持OBS表）
#### 功能描述
指定筛选条件删除分区表的一个或多个分区。
#### 注意事项
- 该命令仅支持操作OBS表，不支持对DLI表进行操作。
- 删除操作仅删除表分区元数据，在使用本节语句删除分区时，OBS目录的数据不会自动删除。
- 所要删除分区的表必须是已经存在的表，否则会出错。
- 所要删除的分区必须是已经存在的，否则会出错，可通过语句中添加"IF EXISTS"避免该错误。
 
#### 语法格式
```
ALTER TABLE [db_name.]table_name
  DROP [IF EXISTS]
  PARTITIONS partition_filtercondition;
```
#### 关键字
- DROP：删除表分区。
- IF EXISTS：所要删除的分区必须是已经存在的，否则会出错。
- PARTITIONS：分区。
 
#### 参数说明
表1参数描述 
| **参数**                    | **描述**                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 |
|:---|:---|
| db_name                   | Database名称，由字母、数字和下划线（_）组成。不能是纯数字，且不能以下划线开头。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           |
| table_name                | Database中的表名，由字母、数字和下划线（_）组成。不能是纯数字，且不能以下划线开头。匹配规则为：\^(?!_)(?!\[0-9\]+$)\[A-Za-z0-9_$\]\*$。如果特殊字符需要使用单引号（''）包围起来。 **该命令仅支持操作OBS表，不支持对DLI表进行操作**。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           |
| partition_filtercondition | 分区筛选条件。具体可以为以下格式： \<分区列名\> \<[运算符](https://support.huaweicloud.com/sqlref-spark-dli/dli_08_0061.html#dli_08_0061__zh-cn_topic_0206797024_zh-cn_topic_0093946932_t34b3b699258a401085f3c3b3ad1a3717)\> \<分区列比较值\> 例如：start_date \< '201911' - 示例1：\<partition_filtercondition1\> AND\|OR \<partition_filtercondition2\> 例如：start_date \< '201911' OR start_date \>= '202006'   - 示例2：（\<partition_filtercondition1\>)\[,partitions (\<partition_filtercondition2\>), ...\] 例如：(start_date \<\> '202007'), partitions(start_date \< '201912')    |
   
#### 示例
为了便于理解删除分区语句的使用方法，本节示例为您提供源数据，基于源数据提供删除分区的操作示例。
1. 使用DataSource语法创建一个OBS表分区表。 
   创建了一个名为student的OBS分区表，表中有学生学号（id），学生姓名（name），学生院系编号（facultyNo）和学生班级编号（classNo），该表使用学生院系编号（facultyNo）和学生班级编号（classNo）进行分区。
   ```
   create table if not exists student (
   id int,
   name STRING,
   facultyNo int,
   classNo INT)
   using csv
   options (path 'path 'obs://bucketName/filePath'')
   partitioned by (facultyNo, classNo);
   ```
   
   
2. 在表格中插入分区数据。 
   利用插入数据中的内容，可以插入以下数据
   ```
   INSERT into student
   partition (facultyNo = 10, classNo = 101)
   values (1010101, "student01"), (1010102, "student02");
   INSERT into student
   partition (facultyNo = 10, classNo = 102)
   values (1010203, "student03"), (1010204, "student04");
   INSERT into student
   partition (facultyNo = 20, classNo = 101)
   values (2010105, "student05"), (2010106, "student06");
   INSERT into student
   partition (facultyNo = 20, classNo = 102)
   values (2010207, "student07"), (2010208, "student08");
   INSERT into student
   partition (facultyNo = 20, classNo = 103)
   values (2010309, "student09"), (2010310, "student10");
   INSERT into student
   partition (facultyNo = 30, classNo = 101)
   values (3010111, "student11"), (3010112, "student12");
   INSERT into student
   partition (facultyNo = 30, classNo = 102)
   values (3010213, "student13"), (3010214, "student14");
   ```
   
   
3. 查看分区。 
   利用查看指定表所有分区中的内容，可以查看相关的分区内容。
   示例代码如下：
   ```
   SHOW partitions student;
   ```
   表2表数据示例 
   | facultyNo    | classNo     |
   |:---|:---|
   | facultyNo=10 | classNo=101 |
   | facultyNo=10 | classNo=102 |
   | facultyNo=20 | classNo=101 |
   | facultyNo=20 | classNo=102 |
   | facultyNo=20 | classNo=103 |
   | facultyNo=30 | classNo=101 |
   | facultyNo=30 | classNo=102 |
      
   
   
4. 删除分区。 
   ![](https://support.huaweicloud.com/sqlref-spark-dli/public_sys-resources/note_3.0-zh-cn.png)
   本节操作介绍按指定筛选条件删除分区。无需指定筛选条件请参考[删除分区](https://support.huaweicloud.com/sqlref-spark-dli/dli_08_0083.html#dli_08_0083)。
   本示例与[删除分区](https://support.huaweicloud.com/sqlref-spark-dli/dli_08_0083.html#dli_08_0083)不可混合使用。请区分此处关键字"partitions"与[删除分区](https://support.huaweicloud.com/sqlref-spark-dli/dli_08_0083.html#dli_08_0083)的关键字"partition"。
   - **示例1：按指定筛选条件删除分区** **（该操作仅适用于OBS表）** **，使用AND语句删除分区数据。**
     表3执行前数据 
     | facultyNo    | classNo     |
     |:---|:---|
     | facultyNo=10 | classNo=101 |
     | facultyNo=10 | classNo=102 |
     | facultyNo=20 | classNo=101 |
     | facultyNo=20 | classNo=102 |
        
     执行以下语句删除facultyNo = 20且classNo = 102分区：
     ```
     ALTER TABLE student
     DROP IF EXISTS
     PARTITIONS (facultyNo = 20 AND classNo = 102);
     ```
     可以看到该语句会删除同时满足（AND）两个条件的分支的分区。
     表4执行后数据 
     | facultyNo    | classNo     |
     |:---|:---|
     | facultyNo=10 | classNo=101 |
     | facultyNo=10 | classNo=102 |
     | facultyNo=20 | classNo=101 |
        
     
   
   - **示例2：** **按指定筛选条件删除分区** **（该操作仅适用于OBS表）** **，使用OR语句进行删除。**
     表5执行前数据 
     | facultyNo    | classNo     |
     |:---|:---|
     | facultyNo=10 | classNo=101 |
     | facultyNo=10 | classNo=102 |
     | facultyNo=20 | classNo=101 |
     | facultyNo=20 | classNo=102 |
        
     执行语句删除满足条件facultyNo = 10或classNo = 101的分区：
     ```
     ALTER TABLE student 
     DROP IF EXISTS
     PARTITIONS (facultyNo = 10),
     PARTITIONS (classNo = 101);
     ```
     执行结果：
     表6执行后数据 
     | facultyNo    | classNo     |
     |:---|:---|
     | facultyNo=20 | classNo=102 |
        
     在上述删除条件的框选下，分区记录中第一条数据既满足院系编号，又满足班级编号，第二条数据满足了院系编号，第三条数据满足了班级编号。
     因此执行删除分区语句后只剩余1行分区。
     按照方法一，上述执行语句还可以写成：
     ```
     ALTER TABLE student
     DROP IF EXISTS
     PARTITIONS (facultyNo = 10 OR classNo = 101);
     ```
     
   
   - **示例3：** **按指定筛选条件删除分区** **（该操作仅适用于OBS表）** **，使用关系运算符语句删除指定分区。**
     表7执行前数据 
     | facultyNo    | classNo     |
     |:---|:---|
     | facultyNo=10 | classNo=101 |
     | facultyNo=10 | classNo=102 |
     | facultyNo=20 | classNo=101 |
     | facultyNo=20 | classNo=102 |
     | facultyNo=20 | classNo=103 |
        
     执行删除分区语句，删除classNo大于100小于102的分区：
     ```
     ALTER TABLE student
     DROP IF EXISTS
     PARTITIONS (classNo BETWEEN 100 AND 102);
     ```
     执行结果：
     表8执行前数据 
     | facultyNo    | classNo     |
     |:---|:---|
     | facultyNo=20 | classNo=103 |
        
     
   
   
   
   
 
