MongoDB的再次相逢之聚合(三)
来源:互联网 发布:软件源代码销售合同 编辑:程序博客网 时间:2024/05/04 04:00
MapReduce
MapReduce是一种编程模型,用于大规模数据集(大于1TB)的并行运算。概念”Map(映射)”和”Reduce(归约)”,和它们的主要思想,都是从函数式编程语言里借来的,还有从矢量编程语言里借来的特性。它极大地方便了编程人员在不会分布式并行编程的情况下,将自己的程序运行在分布式系统上。 当前的软件实现是指定一个Map(映射)函数,用来把一组键值对映射成一组新的键值对,指定并发的Reduce(归约)函数,用来保证所有映射的键值对中的每一个共享相同的键组;
执行流程图:
例1:找出集合中的所有键
MongoDB没有模式,所以并不知晓每个文档有多少个键.通常找到集合的所有键的做好方式是用MapReduce。 在映射阶段,想得到文档中的每个键.map函数使用emit 返回要处理的值.emit会给MapReduce一个键和一个值。 这里用emit将文档某个键的记数(count)返回({count:1}).我们为每个键单独记数,所以为文档中的每一个键调用一次emit。 this是当前文档的引用:
map=function(){ for(var key in this){ emit(key,{count:1}) }};
这样返回了许许多多的{count:1}文档,每一个都与集合中的一个键相关.这种有一个或多个{count:1}文档组成的数组,会传递给reduce函数.reduce函数有两个参数,一个是key,也就是emit返回的第一个值,另一个参数是数组,由一个或者多个与键对应的{count:1}文档组成。
reduce=function(key,emits){ total=0; for(var i in emits){ total+=emits[i].count; } return {count:total}; }
reduce要能被反复被调用,不论是映射环节还是前一个化简环节。reduce返回的文档必须能作为reduce的第二个参数的一个元素。如x键映射到了3个文档{“count”:1,id:1},{“count”:1,id:2},{“count”:1,id:3} 其中id键用于区别。MongoDB可能这样调用reduce:
r1=reduce(“x”,[{“count”:1,id:1},{“count”:1,id:2}])
{count:2}
r2=reduce(“x”,[{“count”:1,id:3}])
{count:1}
reduce(“x”,[r1,r2])
{count:3}
不能认为第二个参数总是初始文档之一(比如{count:1})或者长度固定。reduce应该能处理emit文档和其他reduce返回结果的各种组合。
总之,MapReduce函数可能会是下面这样:
mr = db.runCommand({"mapreduce" : "foo", "map" : map,"reduce" : reduce}){ "reduce" : "tmp.mr.mapreduce_1266787811_1", // 这是存放MapReduce结果集合名,临时集合连接关闭自动删除 "timeMillis" : 12, // 操作花费的时间,单位毫秒 "count" : { "input" : 6 //发往到map函数的文档个数 "emit" : 14 //在map函数中emit被调用的次数 "output" : 5 //结果集合中的文档数量 }, "ok" : true}
例2:网页分类
我们有这样一个网站,用户可以在其上提交他们喜爱的链接url,比如百度(http://www.baidu.com),并且提交者可以为这个url添加一些标签,作为主题,其他用户可以为这条信息打分。我们有一个集合,收集了这些信息,然后我们需要看看哪种主题最为热门,热门程度由最新打分日期和所给分数共同决定。
首先建立一个map函数,发出(emit)标签和一个基于流行度和新旧程度的值。
> map = function(){ for(var i in this.tags){ var recency = 1/(new Date() - this.date); var score = recency * this.score; emit(this.tags[i], {"urls":[this.url], "score":this.score}); } };
现在就化简同一个标签的所有值,以得到这个标签的分数:
reduce = function(key, emits) { var total = {"urls":[], "score":0}; for(var i in emits) { emits[i].urls.forEach(function(url) { total.urls.push(url); }); total.score += emits[i].score; } return total; };
MongoDB的MapReduce
MapReduce命令还有很多可选的键:
“finalize” : 函数
将reduce的结果发送给这个键,这是处理过程的最后一步。
“keeplize” : 布尔
如果值为true,那么在连接关闭时会将临时结果集合保存下来,否则不保存。
“output” : 字符串
输出集合的名称,如果设置了这项,系统会自动设置keeptemp : true。
“query” : 文档
在发往map函数前,先用指定条件过滤文档。
“sort” : 文档
在发往map函数前给文档排序(与limit一同使用非常有用)。
“limit” : 整数
在发往map函数的文档数量的上限。
“scope” : 文档
可以再Javascript代码中使用的变量。
“verbose” : 布尔
是否记录详细的服务器日志。
——山外青山楼外楼,码农写博一壶酒,不煮酒,亦论英雄——-
- MongoDB的再次相逢之聚合(三)
- MongoDB的再次相逢之聚合(一)
- MongoDB的再次相逢之聚合(二)
- MongoDB基础学习三 ---- MongoDB的常用聚合操作
- 【MongoDB】MongoDB之聚合框架
- MongoDB 笔记之 聚合
- MongoDB之聚合
- mongodb的高级操作(聚合框架)
- mongodb的高级操作(聚合框架)
- mongodb的高级操作(聚合框架)
- MongoDB的聚合查询
- MongoDB的聚合框架
- mongodb的聚合使用
- MongoDB的聚合操作
- MongoDB的聚合(aggregate)
- mongodb之聚合管道操作符的错误用法之$project(一)
- 学习MongoDB 九: MongoDB聚合(单一用途的聚合方法)(一)
- mongodb进阶二之mongodb聚合
- 挑战练习题2.3动态规划 poj2385Apple Catching dp
- ActiveMQ介绍及Spring整合实例
- Kafka内部网络框架
- Leetcode 77
- BFC
- MongoDB的再次相逢之聚合(三)
- iOS--脚本配置Xcode Project(打包)
- IOS学习之路
- Qt 播放音频文件
- 边缘检测 从Roberts到Canny算子
- session和cache的区别
- Unable to load configuration.
- Leetcode--Find the Difference[python]
- ToolsVersion="14.0",,这个报错。