增加分区

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

增加值分区

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

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

  • 使用 addValuePartitions 函数

对于值分区的数据库,若要添加的数据不在分区方案以内,可通过配置参数newValuePartitionPolicy来指定以何种方式来处理。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);

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

1000100

增加范围分区

对于范围分区的数据库,无法像值分区数据库那样根据设置参数来自动增加分区,但可以通过 addRangePartitions 函数扩展分区方案。例如,给上例中的数据库的ID分区层新增[100,150), [150,200)和[200,250)这三个分区:

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

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

1010100