mongoDB的MapReduce简介

        分类:            MongoDB2012-12-06 21:378676人阅读评论(2)收藏举报

MongoDB MapReduce

MapReduce是一种计算模型,简单的说就是将大批量的工作(数据)分解(MAP)执行,然后再将结果合并成最终结果(REDUCE)。这样做的好处是可以在任务被分解后,可以通过大量机器进行并行计算,减少整个操作的时间。

上面是MapReduce的理论部分,下面说实际的应用,下面以MongoDB MapReduce为例说明。

下面是MongoDB官方的一个例子:

> db.things.insert( { _id : 1, tags : ['dog', 'cat'] } );
> db.things.insert( { _id : 2, tags : ['cat'] } );
> db.things.insert( { _id : 3, tags : ['mouse', 'cat', 'dog'] } );
> db.things.insert( { _id : 4, tags : []  } );> // map function
> map = function(){
...    this.tags.forEach(
...        function(z){
...            emit( z , { count : 1 } );
...        }
...    );
...};> // reduce function
> reduce = function( key , values ){
...    var total = 0;
...    for ( var i=0; i<values.length; i++ )
...        total += values[i].count;
...    return { count : total };
...};db.things.mapReduce(map,reduce,{out:'tmp'})
{"result" : "tmp","timeMillis" : 316,"counts" : {"input" : 4,"emit" : 6,"output" : 3},"ok" : 1,
}
> db.tmp.find()
{ "_id" : "cat", "value" : { "count" : 3 } }
{ "_id" : "dog", "value" : { "count" : 2 } }
{ "_id" : "mouse", "value" : { "count" : 1 } }

例子很简单,计算一个标签系统中每个标签出现的次数。

这里面,除了emit函数之外,所有都是标准的js语法,这个emit函数是非常重要的,可以这样理解,当所有需要计算的文档(因为在mapReduce时,可以对文档进行过滤,接下来会讲到)执行完了map函数,map函数会返回key_values对,key即是emit中的第一个参数key,values是对应同一key的emit的n个第二个参数组成的数组。这个key_values会作为参数传递给reduce,分别作为第1.2个参数。

reduce函数的任务就是将key-values变成key-value,也就是把values数组变成一个单一的值value。当key-values中的values数组过大时,会被再切分成很多个小的key-values块,然后分别执行Reduce函数,再将多个块的结果组合成一个新的数组,作为Reduce函数的第二个参数,继续Reducer操作。可以预见,如果我们初始的values非常大,可能还会对第一次分块计算后组成的集合再次Reduce。这就类似于多阶的归并排序了。具体会有多少重,就看数据量了。

reduce一定要能被反复调用,不论是映射环节还是前一个简化环节。所以reduce返回的文档必须能作为reduce的第二个参数的一个元素。

(当书写Map函数时,emit的第二个参数组成数组成了reduce函数的第二个参数,而Reduce函数的返回值,跟emit函数的第二个参数形式要一致,多个reduce函数的返回值可能会组成数组作为新的第二个输入参数再次执行Reduce操作。)

MapReduce函数的参数列表如下

db.runCommand({ mapreduce : <collection>,map : <mapfunction>,reduce : <reducefunction>[, query : <query filter object>][, sort : <sort the query.  useful for optimization>][, limit : <number of objects to return from collection>][, out : <output-collection name>][, keeptemp: <true|false>][, finalize : <finalizefunction>][, scope : <object where fields go into javascript global scope >][, verbose : true]}
);

或者这么写:

db.collection.mapReduce( <map>, <reduce>, { <out>, <query>, <sort>, <limit>, <keytemp>,  <finalize>, <scope>, <jsMode>, <verbose> } )
  • mapreduce:指定要进行mapreduce处理的collection
  • map:map函数
  • reduce:reduce函数
  • out:输出结果的collection的名字,不指定会默认创建一个随机名字的collection(如果使用了out选项,就不必指定keeptemp:true了,因为已经隐含在其中了)
  • query:一个筛选条件,只有满足条件的文档才会调用map函数。(query。limit,sort可以随意组合)
  • sort:和limit结合的sort排序参数(也是在发往map函数前给文档排序),可以优化分组机制
  • limit:发往map函数的文档数量的上限(要是没有limit,单独使用sort的用处不大)
  • keytemp:true或false,表明结果输出到的collection是否是临时的,如果想在连接关闭后仍然保留这个集合,就要指定keeptemp为true,如果你用的是MongoDB的mongo客户端连接,那必须exit后才会删除。如果是脚本执行,脚本退出或调用close会自动删除结果collection
  • finalize:是函数,它会在执行完map、reduce后再对key和value进行一次计算并返回一个最终结果,这是处理过程的最后一步,所以finalize就是一个计算平均数,剪裁数组,清除多余信息的恰当时机
  • scope:javascript代码中要用到的变量,在这里定义的变量在map,reduce,finalize函数中可见
  • verbose:用于调试的详细输出选项,如果想看MpaReduce的运行过程,可以设置其为true。也可以print把map,reduce,finalize过程中的信息输出到服务器日志上。

执行MapReduce函数返回的文档结构如下

{ result : <collection_name>,

timeMillis : <job_time>,

counts : {

input : <number of objects scanned>,

emit : <number of times emit was called>,

output : <number of items in output collection>

} ,

ok : <1_if_ok>,

[, err : <errmsg_if_error>]

}

  • result:储存结果的collection的名字,这是个临时集合,MapReduce的连接关闭后自动就被删除了。
  • timeMillis:执行花费的时间,毫秒为单位
  • input:满足条件被发送到map函数的文档个数
  • emit:在map函数中emit被调用的次数,也就是所有集合中的数据总量
  • ouput:结果集合中的文档个数(count对调试非常有帮助)
  • ok:是否成功,成功为1
  • err:如果失败,这里可以有失败原因,不过从经验上来看,原因比较模糊,作用不大

java代码执行MapReduce的方法:

[java] view plaincopyprint?
  1. public void MapReduce() {
  2. Mongo mongo = new Mongo("localhost",27017);
  3. DB db = mongo.getDB("qimiguangdb");
  4. DBCollection coll = db.getCollection("collection1");
  5. String map = "function() { emit(this.name, {count:1});}";
  6. String reduce = "function(key, values) {";
  7. reduce=reduce+"var total = 0;";
  8. reduce=reduce+"for(var i=0;i<values.length;i++){total += values[i].count;}";
  9. reduce=reduce+"return {count:total};}";
  10. String result = "resultCollection";
  11. MapReduceOutput mapReduceOutput = coll.mapReduce(map,
  12. reduce.toString(), result, null);
  13. DBCollection resultColl = mapReduceOutput.getOutputCollection();
  14. DBCursor cursor= resultColl.find();
  15. while (cursor.hasNext()) {
  16. System.out.println(cursor.next());
  17. }
  18. }

转载于:https://www.cnblogs.com/HuiLove/p/3981775.html

mongodb mapreduce用法相关推荐

  1. MongoDB 基础用法及学习笔记

    MongoDB 基础用法 环境配置与安装 安装 查看MongoDB版本 启动MongoDB服务 检查服务状态 启动服务 打开配置文件,连接MongoDB 查看数据列表 退出 MongoDB 连接 Mo ...

  2. MongoDB基本用法

    MongoDB基本用法 1.使用数据库.创建数据库 use itying 如果真的想把这个数据库创建成功,那么必须插入一个数据. 数据库中不能直接插入数据,只能往集合(collections)中插入数 ...

  3. 第10讲:高效存储 MongoDB 的用法

    上节课我们学习了如何用 pyquery 提取 HTML 中的信息,但是当我们成功提取了数据之后,该往哪里存放呢? 用文本文件当然是可以的,但文本存储不方便检索.有没有既方便存,又方便检索的存储方式呢? ...

  4. MongoDB查询用法大全

    转载 http://blog.163.com/lgh_2002/blog/static/440175262012052116455/ 详见官方的手册: http://www.mongodb.org/d ...

  5. MongoDB:MapReduce基础及实例

    背景 MapReduce是个非常灵活和强大的数据聚合工具.它的好处是可以把一个聚合任务分解为多个小的任务,分配到多服务器上并行处理. MongoDB也提供了MapReduce,当然查询语肯定是Java ...

  6. nosql mysql mongodb_nosql数据库MongoDB的用法

    MongoDB常用命令 1.启动命令 mongod 启动数据库进程 --dbpath 制定数据库的目录 --port 制定数据库的端口,默认是27017 --bind_ip 绑定IP --direct ...

  7. mongodb MapReduce

    MapReduce 命令以下是MapReduce的基本语法:>db.collection.mapReduce(function() {emit(key,value);}, //map 函数fun ...

  8. MongoDB CLI 用法

    一.简介 MongoDB 是一款流行的开源文档型数据库. MongoDB 数据库的一些特性: 面向文档存储,基于JSON/BSON 可表示灵活的数据结构 动态 DDL能力,没有强Schema约束,支持 ...

  9. 后端:C#操作Mongodb用法笔记

    MongoDB 是一个基于分布式文件存储的数据库.由 C++ 语言编写.旨在为 WEB 应用提供可扩展的高性能数据存储解决方案.今天主要给大家介绍一下C#编程语言下Mongodb的用法.开发环境为VS ...

最新文章

  1. 人才招聘丨 清华大学精准医学研究院招聘启事
  2. Maven学习总结(七)——eclipse中使用Maven创建Web项目
  3. html鼠标长按事件,JavaScript-web如何获取长按鼠标左键事件
  4. 三维空间几何变换原理[平移、旋转、错切]
  5. pandas库Series使用和ix、loc、iloc基础用法
  6. 小程序开发学习(1)---app.json详解篇
  7. 【JavaScript】网站源码防止被人另存为
  8. 我的第一个项目----Java图书管理系统
  9. java命令行参数写哪里_Java的命令行参数
  10. 如何测试连接MsSQL数据库-------UDL文件
  11. USACO 2006 Open, Problem. The Country Fair 动态规划
  12. [LUOGU] P2886 [USACO07NOV]牛继电器Cow Relays
  13. 转:能和LoadRunner匹敌的VS2010/2012Web负载测试
  14. WinForm界面开发
  15. regedit是什么意思_regedit是什么意思?
  16. Listary 配置常用搜索
  17. 论坛网站进行帖子保存php,PHPwind论坛专用采集器
  18. html链接打开excel表格,Excel表格中怎么设置超链接的形式打开其他Sheet工作簿
  19. 毕设项目-人脸识别考勤签到系统
  20. android远程控制win10,微软推出适用于Win10专业版的Android远程控制

热门文章

  1. 『天涯杂谈』走的地方越多,越觉的中国的狭隘
  2. 2019-03-13
  3. GeoTools——读取shapefile数据
  4. mysql——逗号分割字段情况
  5. web文件上传(一)--文件上传与json上传区别及方法
  6. 8个jQuery Mobile基础教程
  7. OGRE 1.7.2 [Cthugha] 编译方法
  8. 一种软阴影的实现方法
  9. 计算机一级wps视频教程,计算机一级WPS
  10. r语言c50算法的过程,【机器学习与R语言】5-规则学习算法