文档首页> 数据湖探索 DLI> Spark SQL语法参考> 表相关> 分区相关> 指定筛选条件删除分区(只支持OBS表)
更新时间:2024-02-07 GMT+08:00

指定筛选条件删除分区(只支持OBS表)

功能描述

指定筛选条件删除分区表的一个或多个分区。

注意事项

  • 该命令仅支持操作OBS表,不支持对DLI表进行操作。
  • 所要删除分区的表必须是已经存在的表,否则会出错。
  • 所要删除的分区必须是已经存在的,否则会出错,可通过语句中添加“IF EXISTS”避免该错误。

语法格式

1
2
3
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

分区筛选条件。具体可以为以下格式:

<分区列名> <运算符> <分区列比较值>

例如: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)进行分区。

    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);
    

  2. 在表格中插入分区数据。

    利用插入数据中的内容,可以插入以下数据

     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");
    

  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. 删除分区。

    本节操作介绍按指定筛选条件删除分区。无需指定筛选条件请参考删除分区

    本示例与删除分区不可混合使用。请区分此处关键字“partitions”与删除分区的关键字“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