Example 2.数据表分区




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



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


我们可以根据数据表中某列的范围进行分区。以下例子根据ID列的范围,把表t保存为分布式数据库db中的分区表:



n=1000000

ID=rand(10, n)

x=rand(1.0, n)

t=table(ID, x);


db=database("dfs://rangedb", 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 2b:保存值分区数据库表


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



n=1000000

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

x=rand(1.0, n)

t=table(month, x);


db=database("dfs://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 2c:保存层次分区的数据库表


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



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("dfs://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.