[集]mapreduce使用小解
这样一个情况,在mnesia数据库下有这样一个表:{tab, {{netaddress, date}, num}}
[注:netaddress网站名;date是时间,单位是天,格式{year, month, day};num是指这个网站在这一天被访问的次数]
这儿的主键是{netaddress, date}, num是整型,代表这天这个网站被访问的次数,下面需求来了:
求{2011, 1, 1}到今天对应网站的总共访问次数?
步骤:取出数据表中,{2011,1,1}到今天的所有数据,把netaddress进行消重,并把对应的num的值相加
实现:
1、取出所有数据List,格式{netaddress, num}
2、新增一个ets表, {key, value},其中key为网站名netaddress, value为进程id
3、对List中的每一条数据,按id为netaddress从ets表中查询,
3.1如果没有这条记录,Pid = spawn("进程"), 并在ets表中插入数据{netaddress, Pid};
3.2如果有这条记录,那么得到Pid, 并用 Pid ! {add, num}发送信息
3.3如上操作直到List=:=[],从ets表中得到全部的列表List2, 分别对每一条记录做如下操作:
如:记录{netaddress, Pid}, Pid ! {finished}, 发送数据后,spawn出来的进程会把它的状态(即这个网站在这段时间的访问次数)发回过来
在主程序中有receive来接收spawn出来的数据,然后把它再放到另一个ets表中{netaddress, num},这儿的num是指这段时间内这个网站被访问的次数