指定筛选条件删除分区(只支持OBS表)
功能描述
指定筛选条件删除分区表的一个或多个分区。
注意事项
- 该命令仅支持操作OBS表,不支持对DLI表进行操作。
- 所要删除分区的表必须是已经存在的表,否则会出错。
- 所要删除的分区必须是已经存在的,否则会出错,可通过语句中添加“IF EXISTS”避免该错误。
语法格式
1 2 3 |
ALTER TABLE [db_name.]table_name DROP [IF EXISTS] PARTITIONS partition_filtercondition; |
关键字
- DROP:删除表分区。
- IF EXISTS:所要删除的分区必须是已经存在的,否则会出错。
- PARTITIONS:分区。
参数说明
参数 |
描述 |
---|---|
db_name |
Database名称,由字母、数字和下划线(_)组成。不能是纯数字,且不能以下划线开头。 |
table_name |
Database中的表名,由字母、数字和下划线(_)组成。不能是纯数字,且不能以下划线开头。匹配规则为:^(?!_)(?![0-9]+$)[A-Za-z0-9_$]*$。如果特殊字符需要使用单引号('')包围起来。 该命令仅支持操作OBS表,不支持对DLI表进行操作。 |
partition_filtercondition |
分区筛选条件。具体可以为以下格式: <分区列名> <运算符> <分区列比较值> 例如:start_date < '201911' |
示例
为了便于理解删除分区语句的使用方法,本节示例为您提供源数据,基于源数据提供删除分区的操作示例。
- 使用DataSource语法创建一个OBS表分区表。
创建了一个名为student的OBS分区表,表中有学生学号(id),学生姓名(name),学生院系编号(facultyNo)和学生班级编号(classNo),该表使用学生院系编号(facultyNo)和学生班级编号(classNo)进行分区。
1 2 3 4 5 6 7 8
create table if not exists student ( id int, name STRING, facultyNo int, classNo INT) using csv options (path 'path 'obs://bucketName/filePath'') partitioned by (faculytNo, classNo);
- 在表格中插入分区数据。
利用插入数据中的内容,可以插入以下数据
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
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");
- 查看分区。
利用查看指定表所有分区中的内容,可以查看相关的分区内容。
示例代码如下:
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
- 删除分区。
- 示例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
- 示例1:按指定筛选条件删除分区(该操作仅适用于OBS表),使用AND语句删除分区数据。