数据表分区使用户管理和访问数据子集更方便、快捷,同时保持了数据集的完整性。数据集的维护操作也更高效,因为这些操作是针对需要的数据而不是整个表。
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列进一步分成两个分区。