Example 2.数据表分区




数据表分区使用户管理和访问数据子集更方便、快捷,同时保持了数据集的完整性。数据集的维护操作也更高效,因为这些操作是针对需要的数据而不是整个表。



Example 2a:保存顺序分区数据库表


如果需要加载的表比系统内存大,我们可以使用分区表。下面的脚本根据行的顺序把文本文件USstocks.csv 分成8个分区,然后把分区并行加载到数据库中。结果USstocks是一个分布式表,保存在数据库db对应的文件夹目录下。决定分区数量的原则是:每个分区的大小不超过系统内存的四分之一。



db = database("c:/DolphinDB/Data/seqdb", SEQ, 8)

USstocks = loadTextEx(db, "USstocks",, "C:/DolphinDB/Data/USstocks.csv");



Example 2b:保存范围分区数据库表


我们可以根据数据表中某列的范围进行分区。以下脚本根据TICKER列的4个范围,把文本文件USstocks.csv 保存为DolphinDB分区表:



db=database("C:/DolphinDB/Data/rangedb1", RANGE,  `A`F`N`T`ZZZZ)

USstocks = loadTextEx(db, "USstocks",`TICKER, "C:/DolphinDB/Data/USstocks.csv");



以下例子根据ID列的范围,把表t保存为分布式数据库db中的分区表:



n=1000000

ID=rand(10, n)

x=rand(1.0, n)

t=table(ID, x);


db=database("C:/DolphinDB/Data/rangedb2", RANGE,  0 5 10)

pt = db.createPartitionedTable(t, `pt, `ID)

pt.append!(t);


ID x

-- -


pt=loadTable(db,`pt)

select count(*) from pt;


count

-------

1000000



上述例子中,数据库db有两个分区:[0,5)和[5,10)。保存的表pt也有两个分区。


Example 2c:保存值分区数据库表


我们可以根据列中元素的值进行分区。以下例子根据值分区,把表t保存为数据库db中的分区表:



n=1000000

month=take(2000.01M..2016.12M, n)

x=rand(1.0, n)

t=table(month, x);


db=database("C:/DolphinDB/Data/valuedb", VALUE, 2000.01M..2016.12M)

pt = db.createPartitionedTable(t, `pt, `month)

pt.append!(t);


month x

----- -


pt=loadTable(db,`pt)

select count(x) from pt;


count_x

-------

1000000



上述例子中,数据库db有204个分区。每个分区代表2000年1月到2016年12月之间的每个月份。


Example 2d:保存层次分区的数据库表


一个数据库可以有二级或三级分区。



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


dbDate = database(, VALUE, 2017.08.07..2017.08.11)

dbID=database(, RANGE, 0 50 100)

db = database("C:/DolphinDB/Data/hierDB", HIER, [dbDate, dbID])

pt = db.createPartitionedTable(t, `pt, `date`ID)

pt.append!(t);


ID date x

-- ---- -


pt=loadTable(db,`pt)

select count(x) from pt;


count_x

-------

1000000



上述例子中,数据库db有两级分区。第一级分区是根据值分区,具有5个分区,每个分区代表一天;第二级分区是根据范围分区。第一级的每个分区根据ID列进一步分成两个分区。




Download source code here.