mongo mapReduce的实现个人学习总结

一.概念

      1.map:主要处理输入数据到结果数据的映射关系,这过程包括了数据的各种筛选过滤,过程用js的语法实现;

      2.reduce:处理map阶段输送过来的数据,通常做数据的统计工作,然后将结果以key-values的形式进行映射;

      3.适用场景:大量数据的分组统计,类似关系型数据的group,但是统计效率远远超过mysql的统计效率;

      4.实现语法为js的格式,理解这一点很重要,因为知道了这一点之后,只要你有扎实的JS基础语法,就很容易写map-reduce函数;

      5.map侧重分组的实现,将数据以key和value的形式传给reduce;reduce实现真正的统计功能,将同一组key的value累计统计;

      6.mapReduce最终也是通过聚合管道实现的,所以如果想要知道底层的实现,需要先掌握聚合管道的使用,这里不在本篇文章范围内;

二.实现过程

      1.必须等到所有map函数都处理完后才会进入reduce阶段处理;

      2.每一个document都会经历一次的map处理;

      3.基于第1点,mapreduce阶段为了达到同步又提高运行效率,引入了barrier(同步障),在负责同步的同时完成对map的中间结果的统计,该阶段处理两件事: 

             a:对同一个map节点的相同key的value值进行合并,所以,最终进入reduce阶段的每一个key对应的value是一个数组; 

             b:之后将来自不同map的具有相同的key的键值对送到同一个reduce进行处理。

       4.必须等到所有map函数都处理完后才会进入reduce阶段处理;

       5.如果一个key只对应一个value,则不会调用reduce,直接将结果输出;如果一个key对应多个value,则最终会将key对应的各个value以key-value数组的形式传到reduce阶段;这一点也是我个人印象最深的,笔者在写map-reduce的时候,发现最终的数据结构竟然有写不是和reduce的数据结构一致,后来也是查阅了大量的的其他博客才明白了这一点;

       6.可能一个key对应的values条数很多,将会调用多次reduce,即前一次reduce的结果可能被包含在values中再次传递给reduce方法;

       7.基于第6点,这就要求reduce返回的结果需要和value的结构保持一致;

       8.基于第5点,如果一个key只有一个value,而且在reduce阶段改变了reduce返回的数据结构,会发现最终的结果中map只有一个value的key对应的输出结果和其他的key的数据结构不一致!

      9.java实现:基于mongo的模板:MongoTemplate,该模板提供了mapReduce的几种方法,指定map函数和function函数的脚本路径即可实现(以classpath:开头的js文件路径);该两种函数为js的脚本函数,格式为js语法;

    10.可以为指定mapReduce的结果输出到一个指定的数据库的指定临时集合中,通过out参数指定;也可以只使用临时集合;

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值