删除分区
DolphinDB 支持通过 dropPartition
函数删除分区:
dropPartition(dbHandle, partitionPaths, [tableName], [forceDelete=false], [deleteSchema=false])
其中:
- dbHandle 是数据库句柄。
- partitionPaths 指定删除哪些分区。
- tableName 指定表名。
- forceDelete 指定是否强制删除。
- deleteSchema 指定是否从分区结构中删除该分区。
删除分区结构
仅 VALUE 分区支持删除分区结构的操作。删除时应指定参数 deleteSchema = true。
支持删除分区结构的数据库须满足以下要求:
- 第一级分区为 VALUE 分区。
- 数据库中仅包括一个表。
本节示例中,数据库的第一级分区为 VALUE 分区,第二级分区为 RANGE
分区:
// 建库建表并模拟数据
n=1000000
ID=rand(150, n)
dates=2024.08.07..2024.08.11
date=rand(dates, n)
x=rand(10.0, n)
t=table(ID, date, x)
dbDate = database(, VALUE, 2024.08.07..2024.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);
// 删除 2024,08.07 数据及其分区结构
dropPartition(dbHandle=database("dfs://compoDB"), partitionPaths=2024.08.07, tableName=`pt, deleteSchema=true);
注: 函数
dropPartition
的参数 dbHandle
也可指定为创建数据库时返回的句柄 db
。删除分区数据
要删除分区内数据同时保留分区结构,可在调用函数 dropPartition 时设置参数deleteSchema= false 实现。
本节以删除指定表的分区数据为例进行介绍。以下示例中使用的分布式表 pt
及其数据由以下脚本生成。组合分区的数据库第一层分区为基于日期的值分区,第二层分区为基于值的范围分区:
n=1000000
ID=rand(150, n)
dates=2024.08.07..2024.08.11
date=rand(dates, n)
x=rand(10.0, n)
t=table(ID, date, x)
dbDate = database(, VALUE, 2024.08.07..2024.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 的 "/20240807/0_50" 分区,有以下两种方法:
-
指定路径:
dropPartition(dbHandle=database("dfs://compoDB"), partitionPaths="/20240807/0_50", tableName=`pt);
-
指定条件:
dropPartition(dbHandle=database("dfs://compoDB"), partitionPaths=[2024.08.07, 0], tableName=`pt);
注: "/20240807/0_50" 分区中的 ID 的可取值范围是从 0 到 49,不包括
50。以上脚本中,可以使用 0 到 49 的任一数字来代表此分区。
例 2. 删除一级分区
删除表 pt 的一级分区 2024.08.08,有以下两种方法:
-
使用向量指定该一级分区之下所有分区的路径:
partitions=["/20240808/0_50","/20240808/50_100","/20240808/100_150"] dropPartition(dbHandle=database("dfs://compoDB"), partitionPaths=partitions, tableName=`pt);
-
指定条件:
dropPartition(dbHandle=database("dfs://compoDB"), partitionPaths=2024.08.08, tableName=`pt);
例 3. 删除二级分区
删除表 pt 的二级分区 [0,50),有以下两种方法:
-
使用向量指定含有该二级分区的所有分区的路径:
partitions=["/20240807/0_50","/20240808/0_50","/20240809/0_50","/20240810/0_50","/20240811/0_50"] dropPartition(dbHandle=database("dfs://compoDB"), partitionPaths=partitions, tableName=`pt);
-
指定条件,不过滤一级分区,所以 partitionPaths 的第一个元素为空;第二个元素中的 0 可以是 [0,50) 之间的任意整数:
dropPartition(dbHandle=database("dfs://compoDB"), partitionPaths=[,[0]], tableName=`pt);
例 4. 删除跨多个分区的数据
删除表 pt 的二级分区 [0,50) 和[100,150):
dropPartition(dbHandle=database("dfs://compoDB"), partitionPaths=[,[0,100]], tableName=`pt);
existsPartition 函数可以检查某个分区是否存在。例如,检查数据库 "dfs://compoDB" 中表 pt 对应的 "/20240807/0_50" 分区是否存在:
listTables("dfs://compoDB")
tableName | physicalIndex |
---|---|
pt | 408 |
existsPartition("dfs://compoDB/20240807/0_50/408")
// output
false