增加分区

DolphinDB目前支持给值分区或范围分区的数据库,或者组合分区中包含值分区或范围分区的数据库添加分区。

增加值分区

可以通过两种方式增加新的值分区:

  • 将配置参数 newValuePartitionPolicy 设定为 add。在单机模式中,该参数在dolphindb.cfg中配置。在集群模式中,该参数在cluster.cfg中配置。

  • 使用 addValuePartitions 函数

对于值分区的数据库,若要添加的数据不在分区方案以内,可通过配置参数 newValuePartitionPolicy 来指定以何种方式来处理。该参数的取值有以下3种情况:

  1. 默认情况下,newValuePartitionPolicy=skip。新数据中属于分区方案的部分会保存至数据库。不在分区方案中的数据会被略过,不会保存至数据库。

  2. newValuePartitionPolicy=fail,如果新增的数据中包含至少一条分区方案外的数据,系统会抛出异常,所有新增数据都不会保存。

  3. newValuePartitionPolicy=add,如果新增的数据中包含分区方案外的数据,系统会根据分区列中新的值自动创建分区,所有新增数据均会保存,用户无需手动增加分区。

若配置参数 newValuePartitionPolicy 的值为 skip 或 fail,可以使用 addValuePartitions 函数来扩展分区方案。下面的例子是给组合分区的数据库的日期分区层新增 2017.08.12 到 2017.08.20 分区:

n=1000000
ID=rand(100, n)
dates=2017.08.07..2017.08.11
date=rand(dates, n)
x=rand(10.0, n)
t=table(ID, date, x);

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

addValuePartitions(db,2017.08.12..2017.08.20,1);

// output
9
重要: 添加新的分区后,需要重新加载数据库。
db=database("dfs://compoDB")
pt=loadTable(db,"pt")
t1=table(0..99 as ID,take(2017.08.12,100) as date,rand(10.0,100) as x)
pt.append!(t1)
select count(*) from loadTable("dfs://compoDB","pt");

// output
1000100

增加范围分区

对于范围分区的数据库,无法像值分区数据库那样根据设置参数来自动增加分区,默认会舍弃现有分区之外的数据。可以通过 addRangePartitions 函数扩展分区方案,但只能在最后一个现有数据分区后面添加分区,不能在第一个现有数据分区前面添加分区。例如,可以给上例中的数据库的ID分区层新增 [100,150), [150,200) 和 [200,250) 这三个分区,但无法增加 [50,100) 这个分区:

addRangePartitions(db,100 150 200 250,0);

// output
3

添加新的分区后,需要重新加载数据库。

db=database("dfs://compoDB")
pt=loadTable(db,"pt")
t1=table(rand(100..249,10000) as ID,rand(2017.08.07..2017.08.12,10000) as date,rand(10.0,10000) as x)
pt.append!(t1)
select count(*) from loadTable("dfs://compoDB","pt");

// output
1010100