删除分区

使用 dropPartition 函数删除指定分区的所有数据。

通过指定 dropPartition 函数的的第二个参数 partitionPaths,可以灵活删除分区数据。

  • dropPartition 可以删除指定的分区,此时 partitionPaths 是以 "/" 开头的字符串标量或向量,表示数据库目录下要删除的单个或多个分区的路径。

  • dropPartition 可以删除符合指定条件的分区,此时 partitionPaths 表示过滤条件。
    • 对于单层分区的数据库,partitionPaths 是一个值或向量,系统会删除包含该值或向量中元素的分区。

    • 对于组合分区的数据库,partitionPaths 是多个过滤条件组成的元组,每层分区对应元组中的一个元素,如果某层分区不需要过滤,那么对应的过滤条件为空。

n=1000000
ID=rand(150, n)
dates=2017.08.07..2017.08.11
date=rand(dates, n)
x=rand(10.0, n)
t=table(ID, date, x)
dbDate = database(, VALUE, 2017.08.07..2017.08.11)
dbID = database(, RANGE, 0 50 100 150)
db = database("dfs://compoDB", COMPO, [dbDate, dbID])
pt = db.createPartitionedTable(t, `pt, `date`ID)
pt.append!(t);

上面的代码创建了组合分区的数据库,第一层分区为基于日期的值分区,第二层分区为基于值的范围分区。

例 1. 删除某个分区

删除表 pt 的 "/20170807/0_50" 分区,有以下两种方法:

  • 指定路径:

    dropPartition(db, "/20170807/0_50", tableName=`pt);
  • 指定条件:

    dropPartition(db, [2017.08.07, 0], tableName=`pt);
注: "/20170807/0_50" 分区中的 ID 的可取值范围是从 0 到 49,不包括 50。以上脚本中,可以使用 0 到 49 的任一数字来代表此分区。

例 2. 删除一级分区

删除表 pt 的一级分区 2017.08.08,有以下两种方法:

  • 使用向量指定该一级分区之下所有分区的路径:

    partitions=["/20170808/0_50","/20170808/50_100","/20170808/100_150"]
    dropPartition(db, partitions, tableName=`pt);
  • 指定条件:

    dropPartition(db, 2017.08.08, tableName=`pt);

例 3. 删除二级分区

删除表 pt 的二级分区 [0,50),有以下两种方法:

  • 使用向量指定含有该二级分区的所有分区的路径:

    partitions=["/20170807/0_50","/20170808/0_50","/20170809/0_50","/20170810/0_50","/20170811/0_50"]
    dropPartition(db, partitions, tableName=`pt);
  • 指定条件:

    dropPartition(db, [,[0]], tableName=`pt);

例 4. 删除跨多个分区的数据

删除表 pt 的二级分区 [0,50) 和[100,150):

dropPartition(db, [,[0,100]], tableName=`pt);

existsPartition 函数可以检查某个分区是否存在。例如,检查数据库 "dfs://compoDB" 中表 pt 对应的 "/20170807/0_50" 分区是否存在:

listTables("dfs://compoDB")
tableName physicalIndex
pt 408
existsPartition("dfs://compoDB/20170807/0_50/408")
// output
true