- 浏览: 4259274 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
masuweng:
...
kaptcha验证码组件使用简介 -
caobingyi:
你好,问下html是怎么调用loginCheck方法的?
kaptcha验证码组件使用简介 -
hayoouch:
XieFuQ 写道既然都考虑到乐观锁了,是否可以直接换表存储引 ...
mysql乐观锁总结和实践 -
murdonson:
辛苦了
mysql悲观锁总结和实践 -
iamnotstar:
写得不错,感谢分享
memcached-session-manager配置
Mongodb官网对MapReduce介绍:
Map/reduce in MongoDB is useful for batch processing of data and aggregation operations. It is similar in spirit to using something like Hadoop with all input coming from a collection and output going to a collection. Often, in a situation where you would have used GROUP BY in SQL, map/reduce is the right tool in MongoDB.
翻译过来大致意思就是:Mongodb中的Map/reduce主要是用来对数据进行批量处理和聚合操作,有点类似于使用Hadoop对集合数据进行处理,所有输入数据都是从集合中获取,而MapReduce后输出的数据也都会写入到集合中。通常类似于我们在SQL中使用Group By语句一样。
使用MapReduce要实现两个函数:Map和Reduce。Map函数调用emit(key,value)遍历集合中所有的记录,将key与value传给Reduce函数进行处理。Map函数和Reduce函数是使用Javascript编写的,并可以通过db.runCommand或mapreduce命令来执行MapReduce操作。
MapReduce命令语法如下:
db.runCommand( { mapreduce : <collection>, map : <mapfunction>, reduce : <reducefunction>, out : <see output options below> [, query : <query filter object>] [, sort : <sorts the input objects using this key. Useful for optimization, like sorting by the emit key for fewer reduces>] [, limit : <number of objects to return from collection, not supported with sharding>] [, keeptemp: <true|false>] [, finalize : <finalizefunction>] [, scope : <object where fields go into javascript global scope >] [, jsMode : true] [, verbose : true] } );
参数说明:
mapreduce:要操作的目标集合
map:映射函数(生成键值对序列,作为Reduce函数的参数)
reduce:统计函数
query:目标记录过滤
sort:对目标记录排序
limit:限制目标记录数量
out:统计结果存放集合(如果不指定则使用临时集合,在客户端断开后自动删除)
keeptemp:是否保留临时集合
finalize:最终处理函数(对reduce返回结果执行最终整理后存入结果集合)
scope:向map、reduce、finalize导入外部变量
verbose:显示详细的时间统计信息
下面使用一个实例来说明MapReduce的具体使用。
应用场景:对students集合中的数据进行统计,根据classid显示每个班级的学生数量。初始数据如下:
> db.students.find() { "_id" : ObjectId("5031143350f2481577ea81e5"), "classid" : 1, "age" : 20, "name" : "kobe" } { "_id" : ObjectId("5031144a50f2481577ea81e6"), "classid" : 1, "age" : 23, "name" : "nash" } { "_id" : ObjectId("5031145a50f2481577ea81e7"), "classid" : 2, "age" : 18, "name" : "james" } { "_id" : ObjectId("5031146a50f2481577ea81e8"), "classid" : 2, "age" : 19, "name" : "wade" } { "_id" : ObjectId("5031147450f2481577ea81e9"), "classid" : 2, "age" : 19, "name" : "bosh" } { "_id" : ObjectId("5031148650f2481577ea81ea"), "classid" : 2, "age" : 25, "name" : "allen" } { "_id" : ObjectId("5031149b50f2481577ea81eb"), "classid" : 1, "age" : 19, "name" : "howard" } { "_id" : ObjectId("503114a750f2481577ea81ec"), "classid" : 1, "age" : 22, "name" : "paul" } { "_id" : ObjectId("503114cd50f2481577ea81ed"), "classid" : 2, "age" : 24, "name" : "shane" } >
Map分组
Map函数必须调用emit(key,value)返回键值对,使用this访问当前待处理的Document。下面我们使用Map函数对students表按classid进行分组。
> map=function(){emit(this.classid,1)} function () { emit(this.classid, 1); } >
Reduce聚合
Reduce函数接收Map函数返回的结果作为参数,Map函数返回的键值序列组合成{key,[value1,value2,value3,……]}传递给reduce,代码如下:
> reduce=function(key,values){ ... var x = 0; ... values.forEach(function(v){x+=v}); ... return x; ... } function (key, values) { var x = 0; values.forEach(function (v) {x += v;}); return x; } >
Reduce函数对values进行统计,从上面的代码可以看出Reduce函数主要是对1班和2班的记录数量进行求和运算。
Result获取结果
Result函数的作用是用来获取计算后的结果,使用命令为:db.结果集.find()。其中的”结果集“可以通过out参数来指定。代码如下所示:
> result=db.runCommand({ ... mapreduce:"students", ... map:map, ... reduce:reduce, ... out:"students_result" ... }); { "result" : "students_result", "timeMillis" : 297, "counts" : { "input" : 9, "emit" : 9, "reduce" : 2, "output" : 2 }, "ok" : 1 } > db.students_result.find() { "_id" : 1, "value" : 4 } { "_id" : 2, "value" : 5 } >
通过MapReduce处理后的结果存放在students_result集合中。
Finalize格式化输出
利用finalize()可以对reduce()的结果进行输出样式的格式化处理。代码如下:
> finalize=function(key,value){return {classid:key,count:value};} function (key, value) { return {classid:key, count:value}; } >
定义好了finalize函数后,重新执行MapReduce,在函数定义中加入"finalize"参数,即可使用上面定义的finalize函数对返回结果进行格式化,代码如下:
> result=db.runCommand({ ... mapreduce:"students", ... map:map, ... reduce:reduce, ... out:"students_result", ... finalize:finalize ... }); { "result" : "students_result", "timeMillis" : 137, "counts" : { "input" : 9, "emit" : 9, "reduce" : 2, "output" : 2 }, "ok" : 1 } > db.students_result.find() { "_id" : 1, "value" : { "classid" : 1, "count" : 4 } } { "_id" : 2, "value" : { "classid" : 2, "count" : 5 } } >
Query对目标记录进行过滤
前面提到了MapReduce语法中有一个query参数是用来对目标集合进行条件过滤,我们只需要在result函数中加入"query"参数即可对结果集进行过滤,代码如下:
> result=db.runCommand({ ... mapreduce:"students", ... map:map, ... reduce:reduce, ... out:"students_result", ... finalize:finalize, ... query:{age:{$gt:22}} ... }); { "result" : "students_result", "timeMillis" : 776, "counts" : { "input" : 3, "emit" : 3, "reduce" : 1, "output" : 2 }, "ok" : 1 } > db.students_result.find() { "_id" : 1, "value" : { "classid" : 1, "count" : 1 } } { "_id" : 2, "value" : { "classid" : 2, "count" : 2 } } >
从上面代码可以看到,我们在result函数中增加了query参数,只对age>22的document进行统计,输出结果每个班的人数就比原来的少了。
对于MapReduce更多信息,参见官网:http://www.mongodb.org/display/DOCS/MapReduce
发表评论
-
Mongodb Sharding Cluster搭建
2012-08-23 01:46 0Sharding架构介绍 Sharding是一种将海量数据 ... -
Mongodb性能监控
2012-08-22 00:42 118861.mongosniff工具 首先了解一下sniffer的 ... -
Mongodb高级管理命令
2012-08-21 01:24 38411.克隆collection 命令格式: >d ... -
Mongodb数据导出工具mongoexport和导入工具mongoimport介绍
2012-08-21 00:35 186957一、导出工具mongoexport Mongodb中的mon ... -
Mongodb数据更新命令、操作符
2012-08-19 23:05 95884一、Mongodb数据更新命令 Mongodb更新有两个命令 ... -
Mongodb存储过程
2012-08-19 20:36 19467Mongodb支持存储过程的使用,存储过程可以接收和输出参数, ... -
Mongodb联合查询
2012-08-19 19:33 112619在关系型数据库中,通过连接运算符可以实现多个表联合查询。而非关 ... -
Mongodb后台daemon方式启动
2012-08-17 01:03 41609Mongodb可以通过命令行方式和配置文件的方式来启动,具体命 ... -
Mongodb主从复制
2012-08-15 01:04 3233主从复制是Mongodb最常用的复制方式。这种方式非常灵活,可 ... -
通过mongodump和mongorestore实现Mongodb备份和恢复
2012-08-14 01:19 83571Mongodb自带了mongodump和mongorestor ... -
Mongodb常用命令介绍
2012-08-13 01:09 25661查看命令的方式: 1.在shell中运行db.listCom ... -
REST is not enabled. use --rest to turn on.
2012-08-13 00:00 5358使用浏览器访问mongodb管理员接口:http://ipad ... -
Mongodb MapReduce Error:'out' has to be a string or an object
2012-08-12 19:32 4203最近在学习Mongodb,作为入门,选择了《Mongodb权威 ... -
MongoDB数据类型
2012-07-09 00:28 7396参考地址:http://wawlian.iteye.com/ ... -
Mongodb在windows下通过配置文件配置和访问
2012-07-09 00:10 17653Mongodb配置文件配置: 第一步:在“D:\M ... -
Mongodb help命令介绍
2012-07-09 00:00 2894首先切换到Mongodb bi ... -
Mongodb在Linux下的安装和启动和配置
2012-07-09 00:11 97668Mongodb的安装与启动 下载链接: htt ... -
Mongodb在windows下的安装和启动
2012-07-08 23:43 66183Mongodb的安装与启动 下载链接:http: ...
相关推荐
MongoDB是一个高性能、开源、无模式的文档导向数据库,由C++编写而成,支持MapReduce编程模型,MapReduce是一种计算模型,用于处理大规模数据集的并行运算。在MongoDB中,MapReduce主要用于执行复杂的数据聚合操作,...
MongoDB的MapReduce是一种在大型数据集上进行并行计算的编程模型,尤其适用于数据分析任务。MapReduce由Google提出,其灵感来源于函数式编程语言中的Map和Reduce概念,旨在简化分布式计算,使得开发者无需深入理解...
MapReduce是MongoDB处理大数据的一种方法,它借鉴了Hadoop的模型,用于执行分布式计算任务,例如数据分析和聚合。 通过运行这些示例代码,开发者不仅可以深入理解MongoDB的API用法,还能了解到如何在实际项目中应用...
MapReduce是Hadoop的另一个组成部分,它是一个编程模型,用于在大量节点上处理和生成大数据集。 MongoDB则是一个面向文档的NoSQL数据库,它通过使用BSON(一种类似于JSON的格式)来存储数据。MongoDB擅长于处理和...
8. MapReduce:虽然现代MongoDB推荐使用聚合框架,但MapReduce仍然是一种处理大数据的手段,用于批量数据处理和分析。 9. 安全性:MongoDB支持用户认证、角色权限控制和加密通信,保障数据安全。 10. 应用集成:...
1. **文档型数据库**:MongoDB以JSON格式的文档作为数据存储单位,这种格式易于阅读和编写,同时也方便与各种编程语言进行交互。 2. **动态模式**:MongoDB支持动态模式,无需预先定义数据结构,这使得数据模型可以...
MongoDB还拥有强大的聚合框架,包括内置的count、group等操作,以及MapReduce功能,用于执行复杂的数据分析任务。同时,MongoDB支持多种编程语言的驱动程序,如Perl、PHP、Java、C#、JavaScript、Ruby、C和C++,方便...
1. 数据模型:关系型数据库采用表格形式存储数据,而 MongoDB 使用文档模型,允许数据以更自然的结构存储。 2. 关联处理:在 MongoDB 中,通过内嵌文档可以避免频繁的关联操作,简化数据模型。但对大型关联数据,...
MongoDB提供了多种编程语言的驱动,如Python、Java、Node.js等,使得开发者可以方便地在不同语言环境中使用MongoDB。了解这些驱动的使用方法和最佳实践,能提高开发效率。 八、安全与认证 确保MongoDB的安全性同样...
- **MapReduce支持**:MongoDB内置了MapReduce功能,用于大规模数据集上的数据汇总操作,方便进行大数据分析工作。 - **跨平台兼容性**:MongoDB可以在多种操作系统上运行,包括但不限于OS X、Linux和Windows等,并...
MongoDB有广泛的驱动程序库,支持多种编程语言,如Java、Python、Node.js等,方便开发者集成到各种应用程序中。 14. 社区与生态系统: MongoDB拥有活跃的社区,提供丰富的文档、教程和第三方工具,帮助用户解决...
4. MapReduce编程模型:用于处理大规模数据集的并行算法模型。 5. 优化器Profiler:分析数据库性能瓶颈。 6. 聚合框架:用于对集合中的数据进行转换和组合,可以执行复杂的聚合操作。 七、其他 1. 深入MongoDB不可...
4. 数据模型设计:讨论如何利用MongoDB的灵活性设计适应不同场景的数据模型。 5. 性能优化:提供提高MongoDB性能的策略,如索引创建、查询优化和存储引擎选择。 6. 复制集与分片:阐述复制集的原理和配置,以及如何...
5. **性能优化**:考虑使用MongoDB的聚合框架或MapReduce功能进行大数据量的转换,以提高效率。 在实际应用中,可能还需要考虑缓存策略、并发控制以及错误处理等问题。对于大规模BOM数据,可以考虑使用MongoDB的分...
5. **应用程序开发**:提供多种编程语言(如Python、Java、Node.js等)的驱动程序使用示例,帮助开发者集成MongoDB到他们的应用中。 6. **复制与分片**:详细解析MongoDB的复制集和分片集群的构建与维护,以满足高...
虽然MongoDB的聚合框架在很多场景下更高效,但它仍然支持MapReduce,这是一种分布式计算模型,可用于处理大规模数据并生成汇总结果。 9. GridFS MongoDB 的GridFS是一个文件存储系统,用于存储和检索大于16MB的大...
MongoDB 是一款非常流行的开源文档型数据库系统,以其灵活的数据模型、高扩展性和强大的性能而闻名于世。它支持多种编程语言,并且有着丰富的生态系统,使得开发者可以轻松地在不同的环境中部署和管理MongoDB。 ###...
文档是MongoDB的基本存储单元,能够轻松地映射到各种编程语言中的对象。 2. **无模式设计**:与传统的关系型数据库不同,MongoDB允许动态模式,即无需预先定义数据结构。这使得数据模型的演变变得简单,适应快速...
它包括Hadoop分布式文件系统(HDFS)和MapReduce编程模型。 HDFS HDFS是一个高度容错的系统,适用于存储大规模数据集。它可以部署在廉价的硬件上,并提供了高吞吐量的数据访问,非常适合于大规模数据集的应用。HDFS...