MapReduce这个名词随着hadoop的用户的增多,越来越被人关注。MapReduce可谓MongoDB之中的亮点,我也想深入了解MapReduce,加上MongoDB操作简单,所以就选择了它。MapReduce可以把问题划分为多个不同部分并分发到不同服务器并行处理问题,每台服务器都把分配给自己的一部分问题处理完毕后,把结果返回给主服务器,主服务器汇总结果,最终完成问题的处理。

Map首先将文档映射到集合并操作文档,这一步可能产生多个键和多个值或者什么也没有(文档中要处理的值为空)。而后按照键分组,并将产生的值组成列表放到对应的键中。Reduce则把列表中的值化简为一个值。这个值被返回,而后继续按键分组,进行化简,直到每个键在列表中只有一个值为止,这个值也就是最终结果。

在MongoDB中,需要用JavaScript写一个Map()函数和一个Reduce()函数。Map函数使用emit函数返回要处理的值。Emit会传给redcuce函数一个键和一个值。Reduce 函数接收两个参数,第一个是key,接收emit返回的键;第二个是values数组,也就是emit返回的值,它有一个或者多个对应于键的文档组成。

下面写一个实例,用实例感悟一下MapReduce。

首先建一实体类,

 

接下来连接数据库,

 

插入几条测试记录,

 

下面就是本例的核心,两个JavaScript方法,主要用于统计不同的单词在集合中出现的次数,

 

用以下代码可以遍历mapreduce返回的结果

 

执行结果

 

本例mapreduce处理结果的方法可能类似下图,执行过程可能不太一样,但是思想就是这么个思想,

 

运行计算时,mongodb会产生几个中间结果,结束后会被自动删除,如图

 

可以再写一对JavaScript函数,统计下单词出现在哪个记录里,

 

执行结果如下(虚线下面的部分)