MongoDb是NoSQl中目前比较流行的一种分布式存储的解决方案,主从,副本集及分片等都支持的很好,在分布式存储的架构下,自然有分布式的计算,MapReduce是Mongodb的分布式计算支持。
它的MapReduce有点类似GroupBy的效果,首先是Map:遍历集合,把具有相同Value的Key整理成一个Key:Values的键值对,作为参数传递给Reduce函数,由Reduce函数进行进一步的化简处理,最后把结果写到指定的集合中。
mongo内置的count,distinct,group 的功能MapReduce都能够实现
> db.events.count(); 13321 > db.runCommand({"distinct":"events","key":"type"}); { "values" : [ "IPA", "IPI", "REG", "OTDPS", "IPO", "EXO", "IPOP", "ECG", "ASO", "CUR" ], "stats" : { "n" : 13321, "nscanned" : 13321, "nscannedObjects" : 13321, "timems" : 117, "cursor" : "BasicCursor" }, "ok" : 1 } >
看看他的语法:
db.runCommand(
{ mapreduce : 集合名,
map : js函数
reduce : js函数
[, query : 文档,发往map函数前先给过渡文档]
[, sort : 文档,发往map函数前先给文档排序]
[, limit : 整数,发往map函数的文档数量上限]
[, out : 字符串,统计结果保存的集合]
[, keeptemp: 布尔值,链接关闭时临时结果集合是否保存]
[, finalize : 函数,将reduce的结果送给这个函数,做最后的处理]
[, scope : 文档,js代码中要用到的变量]
[, jsMode : 布尔值,是否减少执行过程中BSON和JS的转换,默认
true
]
[, verbose : 布尔值,是否产生更加详细的服务器日志,默认
true
]
}
);
下面做一个简单的例子:比如我要找出性别为”男“的人的姓名和性别为“女”的人的姓名,其实就是一个简单的按照性别来分组的功能,
先准备下测试数据
1 连接到MongoDb先
mongo.exe localhost:27017; use test_his; db.auth("test","test");
2 插入测试数据
db.mrtest.insert({"name" : "李雷","sex" : "M"}); db.mrtest.insert({"name" : "小赵","sex" : "M"}); db.mrtest.insert({"name" : "杨丽","sex" : "F"}); db.mrtest.insert({"name" : "红红","sex" : "F"}); db.mrtest.insert({"name" : "小李","sex" : "M"});3 编写Map函数(调用emit)
var map=function(){ emit(this.sex,this.name); }
emit函数的第一个参数为分组的KEY,第二个参数为需要处理的数据(格式为JSON类型)
4 编写Reduce函数
var reduce=function(key,values){ // var retur={sex:key,names:values}; var retur={names:values}; return retur; }Reduce函数,直接返回了按SEX分组后的姓名列表,这个的返回值可以带上SEX,就是注释的那行
5 测试下
finalize
编写一个finalize 函数
var final=function(key,retur){ if(key=="M"){ retur.msg="is a man"; } return retur; }假如是男人,那么描述是“is a man”
6 使用db.runCommand()调用
db.runCommand({ mapreduce:"mrtest", map:map, reduce:reduce, finalize:final, out:"sextest" });将结果保存在sextest中
执行结果 写道
> db.sextest.find();
{ "_id" : "F", "value" : { "names" : [ "杨丽", "红红" ] } }
{ "_id" : "M", "value" : { "names" : [ "李雷", "小赵", "小李" ], "msg" : "is a m
an" } }
{ "_id" : "F", "value" : { "names" : [ "杨丽", "红红" ] } }
{ "_id" : "M", "value" : { "names" : [ "李雷", "小赵", "小李" ], "msg" : "is a m
an" } }
上面是按性别来分组,找出人,假如要算出男女个多少个,MapReduce还可以这样来实现
var map=function(){ emit(this.sex,{count:1}); } var reduce=function(key,values){ var cou=0; for(var i=0;i<values.length;i++){ cou+=values[i].count; } var retur={sex:key,count:cou}; return retur; }
这个是一个简单MapReduc的示例,自然也可以使用JAVA代码进行调用执行,目前针对MongoDb的编程框架,用到的比较多的就是Spring Data For Mongodb ,但是Spring却并没有对MapReduce功能做过多的封装,需要把Map,Reduce的Function函数使用字符串的形式定义,采用RunCommand来执行,这样代码看起来比较难于维护,所以需要的时候,建议采用Hadoop编程框架来做,代码看起来比较优雅。
相关推荐
mongodb mapreduce 实例,该例子主要用来做订单统计的。具体问题请到博客提问。
NULL 博文链接:https://superhuo.iteye.com/blog/1193485
MongoDB MapReduce MapReduce是一种计算模型,简单的说就是将大批量的工作(数据)分解(MAP)执行,然后再将结果合并成最终结果(REDUCE)。这样做的好处是可以在任务被分解后,可以通过大量机器进行并行计算,减少...
Mongodb是针对大数据量环境下诞生的用于保存大数据量的非关系型数据库,针对大量的数据。接下来通过本文给大家介绍Mongodb中MapReduce实现数据聚合方法详解,感兴趣的朋友一起学习吧
MapReduce应该算是MongoDB操作中比较复杂的了,下面这篇文章主要给大家介绍了关于MongoDB中MapReduce使用的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面随着小编来一起看看吧。
MongoDB的MapReduce.pdf 学习资料 复习资料 教学资源
1.分篇章进行学习,内容控制30分钟内 2.1个月疗程,不要放弃治疗哦 3.图文并茂,有问题请发到邮箱
计算机后端-PHP视频教程. mongodb10 MapReduce 统计栏目下的商品.wmv
一个简单的Mongodb mapreduce的例子
主要介绍了MongoDB学习笔记之MapReduce使用示例,本文直接给出实例代码,需要的朋友可以参考下
计算机后端-PHP视频教程. mongodb08 导出导入.wmv
MapReduce 是 Google 在 2004 年发布的一个软件框架,用于支持大规模数据的分布式计算。 MongoDB 是一个开源的面向文档的 NoSQL 数据库系统,使用 C++ 编写。
作为一个优秀的编程模型,MapReduce在大数据处理中有很大的优势,而mongodb也支持这一编程模型,本文通过简单的单词计数示例论述在mongodb中如何使用MapReduce
Mongodb是主流的NOSQL数据库之一,Mongodb最佳实践,详细介绍了Mongodb使用以及底层原理...通过这些学习对Mongodb全方位的学习和理解,适应企业多元化数据库的需要,现在很多企业都在使用Mongodb,像360,百度,京东等
MongoDB五分钟教程:MongoDB Shell入门 基于MongoDB进行分布式数据存储的步骤 MongoDB分布式存储的MapReduce并行查询 实例:MongoDB与Tomcat的结合更便捷
#资源达人分享计划#