MongoDB MapReduce(转)
MapReduce
MapReduce是一种计算模型,简单的说就是将大批量的工作(数据)分解(MAP)执行,然后再将结果合并成最终结果(REDUCE)。这样做的好处是可以在任务被分解后,可以通过大量机器进行并行计算,减少整个操作的时间。
对科班出生的程序员来说,最好的例子莫过于归并排序的例子,没错,归并排序流程就可以看作是一个MapReduce,只是我们在学校写过的归并排序程序可能还没有涉及到并行计算罢了。
上面是MapReduce的理论部分,下面说实际的应用,下面以MongoDB MapReduce为例说明。
下面是MongoDB官方的一个例子:
- , tags : ['dog', 'cat'] } );
- , tags : ['cat'] } );
- , tags : ['mouse', 'cat', 'dog'] } );
- , tags : [] } );
- > // map function
- > m = function(){
- ... this.tags.forEach(
- ... function(z){
- } );
- ... }
- ... );
- ...};
- > // reduce function
- > r = function( key , values ){
- ;
- ; i<values.length; i++ )
- ... total += values[i].count;
- ... return { count : total };
- ...};
- > res = db.things.mapReduce(m, r, { out : "myoutput" } );
- > res
- {
- "result" : "myoutput",
- ,
- "counts" : {
- ,
- ,
- },
- ,
- }
- > db.myoutput.find()
- }}
- }}
- }}
- > db.myoutput.drop()
例子很简单,计算一个标签系统中每个标签出现的次数。
这里面,除了emit函数之外,所有都是标准的js语法,当然你也可以使用你所知道的所有标准js函数。而这个emit函数是非常重要的,他的作用是将一条数据放入数据分组集合,这个分组是以emit的第一个参数为key的。你可以这样理解,当你在所有需要计算的行执行完了map函数,你就得到了一组key-values对。基本key是emit中的key,values是每次emit函数的第二个参数组成的集合。
现在我们的任务就是将这一个key-values变在key-value,也就是把这一个集合变成一个单一的值。这个操作就是Reduce。
好像这里和我们前面的理论是完全一样的,其实不然。当我们的key-values中的values集合过大,会被再切分成很多个小的key-values块,然后分别执行Reduce函数,再将多个块的结果组合成一个新的集合,作为Reduce函数的第二个参数,继续Reducer操作。可以预见,如果我们初始的values非常大,可能还会对第一次分块计算后组成的集合再次Reduce。这就类似于多阶的归并排序了。具体会有多少重,就看数据量了。
上面这一内部机制,我们不必非常了解,但我们必须了解这一机制会要求我们遵守的原则,那就是当我们书写Map函数时,emit的第二个参数形式是我们的Reduce函数的第二个参数,而Reduce函数的返回值,可能会作为新的输入参数再次执行Reduce操作,所以Reduce函数的返回值也需要和Reduce函数的第二个参数结构一致。
作为结束,下面照本宣科说一下MongoDB MapReduce调用参数和返回结果。
参数表如下:
- db.runCommand(
- { mapreduce :
- ,
- map :
- ,
- reduce :
- [, query : ]
- [, sort : ]
- [, limit : ]
- [, out : ]
- [, keeptemp:
- ]
- [, finalize : ]
- [, scope : ]
- [, verbose : true]
- }
- );
- mapreduce:指定要进行mapreduce处理的collection
- map:map函数
- reduce:reduce函数
- query:一个筛选条件,只有满足条件的行才会加入mapreduce集合,而这个筛选过程是先于整个mapreduce流程而执行的
- sort:和query结合的sort排序参数,这是唯一可以优化分组机制的地方
- limit:同上
- out:结果输出的collection的名字,不指定会默认创建一个随机名字的collection
- keytemp:true或false,表明结果输出到的collection是否是临时的,如果为true,则会在客户端连接中断后自动删除,如果你用的是MongoDB的mongo客户端连接,那必须exit后才会删除。如果是脚本执行,脚本退出或调用close会自动删除结果collection
- finalize:和map,reduce一样是一个函数,它可以在reduce得出一个结果后再对key和value进行一次计算并返回一个最终结果
- scope:设置参数值,在这里设置的值在map,reduce,finalize函数中可见
- verbose:在执行过程中打印调试信息。
- 返回结果结构如下:
- { result :
- ,
- counts : {
- input : ,
- emit : ,
- output :
- } ,
- timeMillis : ,
- ok : <1_if_ok>,
- [, err : ]
- }
- result:储存结果的collection的名字
- input:满足条件的数据行数
- emit:emit调用次数,也就是所有集合中的数据总量
- ouput:返回结果条数
- timeMillis:执行时间,毫秒为单位
- err:如果失败,这里可以有失败原因,不过从经验上来看,原因比较模糊,作用不大
再加一个例子:
- //插入一组数据
- ,atima:new Date().getTime() };db.users.insert(u);}
- //map function
- m=function(){emit(this.name,{total:this.age,lasttime:this.atima})}
- //reduce function,key对应的maxtime最新的时间
- ;values.forEach(function(v){sum+=v.total;if(v.lasttime>maxtime)maxtime=v.lasttime;}); return {total:sum,lasttime:maxtime};}
- //运行,结果输入到result集合里
- db.runCommand({mapreduce:'users',map:m,reduce:r,out:'result'});
- db.result.find();
MongoDB MapReduce(转)的更多相关文章
- mongodb mapreduce使用总结
文章来自本人个人博客: mongodb mapreduce使用总结 大家都知道,mongodb是一个非关系型数据库.也就是说.mongodb数据库中的每张表是独立存在的,表与表之间没有不论什么依赖 ...
- [MongoDB]mapReduce
摘要 上篇文章介绍了count,group,distinct几个简单的聚合操作,其中,group比较麻烦一点.本篇文章将学习mapReduce的相关内容. 相关文章 [MongoDB]入门操作 [Mo ...
- MongoDB MapReduce学习笔记
http://cnodejs.org/topic/51a8a9ed555d34c67831fb8b http://garyli.iteye.com/blog/2079158 MapReduce应该算是 ...
- 用C#感受MongoDB MapReduce之魅力 转
MapReduce这个名词随着hadoop的用户的增多,越来越被人关注.MapReduce可谓MongoDB之中的亮点,我也想深入了解MapReduce,加上MongoDB操作简单,所以就选择了它.M ...
- MongoDB MapReduce用法简介
Map-Reduce部分:Map-Reduce相当于关系型数据库中的group by,主要用于统计数据之用.MongoDB提供的Map-Reduce非常灵活,对于大规模数据分析也相当实用. 语法 db ...
- MongoDB:MapReduce基础及实例
背景 MapReduce是个非常灵活和强大的数据聚合工具.它的好处是可以把一个聚合任务分解为多个小的任务,分配到多服务器上并行处理. MongoDB也提供了MapReduce,当然查询语肯定是Java ...
- E QUERY [main] SyntaxError: identifier starts immediately after numeric literal mongodb mapReduce 异常分析 集合命名规范
异常信息 repl_test:PRIMARY> db.0917order_totals_b.find()2018-09-28T15:13:03.992+0800 E QUERY [main] S ...
- mongodb~mapreduce的实现特殊逻辑的统计
map reduce的解释 这是一张来自mongodb-mapreduce图示,比较能说明问题
- MongoDB MapReduce 的示例。
// JavaScript source code db.runCommand({ mapreduce: "page", map: function Map() { emit( t ...
随机推荐
- phalcon: 缓存片段,文件缓存,memcache缓存
几种缓存,需要用到前端配置,加后端实例配合着用 片段缓存: public function indexAction() { //渲染页面 $this->view->setTemplateA ...
- phalcon: 视图集成(内嵌模板)
当一个网站把不同的模板分割成:头部,中间区域,底部时,我们就需要在不同的[中间区域]页面引入相同的头部跟底部.引入有2种方法, 一种是:在controller中调用: $this->view-& ...
- qq 换密保方法 只要有密保就好换手机
特别提醒:必须先绑定手机再做其它操作!!否则有几率冻结更换密保手机号后审核时间2-12小时,请您确定审核通过后再使用(本链接所有号码不需要挂七天常用IP即可绑定手机后改密)电脑换绑定手机方法:复制账号 ...
- c语言数据结构:01背包问题-------动态规划
两天的时间都在学习动态规划:小作业(01背包问题:) 数据结构老师布置的这个小作业还真是让人伤头脑,自己实在想不出来了便去网上寻找讲解,看到一篇不错的文章: http://www.cnblogs.co ...
- linux笔记:linux系统安装-系统分区
分区类型: 1.主分区:最多只能有4个. 2.扩展分区:最多只能有1个:主分区+扩展分区最多有4个:不能写入数据,只能包含逻辑分区. 3.逻辑分区. 格式化: 向磁盘中写入文件系统.会附带地清空磁盘中 ...
- linux笔记:用户管理命令和用户组管理命令
用户管理命令 命令名称:useradd功能:添加用户(添加完后不能立即使用,必须用passwd修改用户密码后才能使用)用法:useradd [选项] 用户名选项参数:-u 手工指定用户的UID-d 手 ...
- Tomcat编码问题
在Tomcat7中,默认URIEncoding="iso8859-1",get请求由于url会完全出现在地址栏,所以传递中文到后台会乱码,需要改成URIEncoding=" ...
- jquery $post $get $
Jquery在异步提交方面封装的很好,直接用AJAX非常麻烦,Jquery大大简化了我们的操作,不用考虑浏览器的诧异了. 推荐一篇不错的jQuery Ajax 实例文章,忘记了可以去看看,地址为:ht ...
- java面向对象编程— —第七章 继承
7.1继承的起源 继承(Inheritance),即在面向对象编程中,可以通过扩展(extends)一个已有的类,并继承该类的属性的行为,来创建一个新的类. 已有的类称为父类(也可以称为基类,超类), ...
- cf 307
一开始我是不想打的 又因为307这个数字太特殊了 毕竟307 希望今天的考试不要挂掉 http://codeforces.com/contest/551/problem/A #include< ...