dropPartition
语法
dropPartition(dbHandle, partitionPaths, tableName,
[forceDelete=false],
[deleteSchema=false])
详情
删除数据库中指定分区的数据。
如果指定了 tableName :删除指定表中符合指定条件的分区数据。
如果没有指定 tableName:删除指定数据库所有表中符合指定条件的分区数据。
参数
dbHandle 分布式数据库的句柄。
partitionPaths 有两种指定模式:
-
指定路径:以 "/" 开头的字符串或字符串向量,表示数据库目录下单个或多个分区的路径。请注意对组合分区,路径必须包括所有层次分区。
-
指定条件:以分区列的一个或多个值组成的标量或向量作为过滤条件,系统会找到并删除这些值所在的分区。对于组合分区,partitionPaths 是由每层分区的过滤条件组成的元组,如果某层分区不需要过滤,那么相应的过滤条件需置为空。
tableName 字符串,表示表名。若分区粒度为数据库级(database: chunkGranularity = 'DATABASE'),可以不指定 tableName,否则必须指定该参数。
forceDelete 布尔值,默认值为 false,表示不开启强制删除。如果 forceDelete =true,即使指定的分区正在恢复,系统也会将其强制删除。
deleteSchema 布尔值,默认值为 false,表示仅删除分区数据,分区方案(partitionSchema)中仍保留其对应的分区方案信息。
如果 deleteSchema=true,在满足以下条件时,删除分区数据及其对应的分区方案信息(可通过 schema.partitionSchema 函数查看):
-
数据库只包含一个表;
-
单级分区时采用 VALUE 分区,或多级分区的第一级为 VALUE 分区;
-
dropPartition
仅删除第一级分区的数据。
例子
下面例子中的脚本需要在集群中的数据节点/计算节点执行。
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" 分区,有以下两种方法:
(1) 指定路径:
dropPartition(db, "/20170807/0_50", tableName=`pt);
(2) 指定条件:
dropPartition(db, [2017.08.07, 0], tableName=`pt);
注意:"/20170807/0_50" 分区中的 ID 的可取值范围是从 0 到 49,不包括 50。以上脚本中,可以使用 0 到 49 的任一数字来代表此分区。
例 2. 删除一级分区的数据
例如,删除表 pt 的一级分区 2017.08.08,有以下两种方法:
(1) 使用向量指定该一级分区之下所有分区的路径:
partitions=["/20170808/0_50","/20170808/50_100","/20170808/100_150"]
dropPartition(db, partitions, tableName=`pt);
(2) 指定条件:
dropPartition(db, 2017.08.08, tableName=`pt);
删除分区数据后,我们使用 schema 函数查看数据库的分区方案:
schema(db);
partitionSchema->([2017.08.11,2017.08.10,2017.08.09,2017.08.08,2017.08.07],[0,50,100,150])
databaseDir->dfs://compoDB
partitionSites->
可以发现,2017.08.08 仍然在分区方案中,这是因为 dropPartition
只删除了
2017.08.08 这个分区中的数据,并不会将 2017.08.08 从数据库的分区方案中移除。由于该例删除的是一级 VALUE 分区,通过指定
deleteSchema = true,来同步删除分区方案中的对应分区信息。
dropPartition(db, 2017.08.08, tableName=`pt, deleteSchema = true);
使用 schema
函数查看数据库的分区方案:
schema(db);
// output
partitionSchema->([2017.08.11,2017.08.10,2017.08.09,2017.08.07],[0,50,100,150])
...
例 3. 删除二级分区的数据
例如,删除表 pt 的二级分区 [0,50),有以下两种方法:
(1) 使用向量指定含有该二级分区的所有分区的路径:
partitions=["/20170807/0_50","/20170808/0_50","/20170809/0_50","/20170810/0_50","/20170811/0_50"]
dropPartition(db, partitions, tableName=`pt);
(2) 指定条件:
dropPartition(db, [,[0]], tableName=`pt);
例 4. 删除多个二级分区的数据
例如,删除表 pt 的二级分区 [0,50) 和 [100,150):
dropPartition(db, [,[0,100]], tableName=`pt);
例 5. 修改分布式数据库中的数据
在 DolphinDB 中,如果要修改分布式数据库中的数据,需要先把相关分区的数据加载到内存中进行修改,然后使用
dropPartition
将数据库中的相关分区删除,最后将内存中修改好的分区数据重新追加到数据库中。
例如,将分布式表 pt 中 date=2017.08.10, ID=88 的记录 x+10。
首先,将包含 date=2017.08.10, ID=88 的所有相关分区数据加载到内存中,这些数据位于 "20170810/50_100" 分区中:
tmp=select * from loadTable("dfs://compoDB","pt") where date=2017.08.10 and 50<=ID<100 ;
接着,将内存表 tmp 中 date=2017.08.10, ID=88 的记录 x+10。:
update tmp set x=x+10 where date=2017.08.10 and ID=88;
然后,删除表 pt 中 "20170810/50_100" 分区中的数据:
dropPartition(db,"/20170810/50_100", tableName=`pt);
最后,将内存中修改好的记录追加到表 pt 中:
pt.append!(tmp);