`
jacobcookie
  • 浏览: 93092 次
社区版块
存档分类
最新评论

MongoDB 关于Map及Reduce

阅读更多

     Hadoop中的map/reduce(分布式计算模型)

     Mapper:对输入的列表中的每一个元素执行一个函数,生成一个列表结果。(运算前后列表的元素数量不变)

     Reduce:对输入的列表的所有元素执行一个函数操作,并将中间结果作为参数继续执行函数。

    

     map把(k1,v1)变成(k2,v2),shuffle把(k2,v2)变成(k2,list(v2)),reduce把(k2,list(v2))变成(k3,v3)。

     (k1,v1)来自于输入,是已知的,shuffle过程由程序自动完成,(k3,v3)也是我们知道的,所以程序员要实现

     的是(k2,v2)。就是说我们知道输入的数据的格式及内容,也知道输出的格式,但是输出内容是由程序计算

     出来的,可以当做是已知的。

     总的来说就是处理输入,产生输出。先把大数据map(分解),再逐一reduce(化简),形成最终结果。

 

     MapReduce在MongoDB中主要用于批量处理数据和集合操作,类似于RDBMS的group操作(分组统计)。

     用this访问当前文档,map中必须有emit函数,才能把map结果传给reduce。

     emit(key,value),key是分组的依据,value是你想要的东西。(也就是要统计的数据)

     如果map结果数据还是很大,可以再切分,然后分别执行reduce函数,所以reduce一定是可以反复利用。

     Map和Reduce函数用Js编写,语法遵循js标准。 

  

     以下是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会遍历集合中的记录
...      emit( z , { count : 1 } ); //emit可以理解为调用reduce方法,这里参数为1[即累加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 };
...};

//这个不属于官方例子,忽略掉
> f= function( key , rvalue ){
   //key 就是分组的依据
   //rvalue 就是reduce的结果 如value的一个实例 {count:6}
   if("cat"==key){
     rvalue.msg="this is cat tag ."
   }
   return rvalue;
...};

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就是key , value就是处理后的返回值
{ "_id" : "mouse", "value" : { "count" : 1 } }

   

    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:对目标集合进行过滤(query,limit,sort可以随意组合)
•sort:和limit结合的sort排序参数(也是在发往map函数前给文档排序),可以优化分组机制
•limit:发往map函数的文档数量的上限(要是没有limit,单独使用sort的用处不大)
•keytemp:是否保存临时结果,如果想在连接关闭后仍然保留这个集合,就要指定keeptemp为true,如果你用的是MongoDB的mongo客户端连接,那必须exit后才会删除。如果是脚本执行,脚本退出或调用close会自动删除结果collection
•finalize:处理结果的最后函数
•scope:向map、reduce、finalize导入外部变量。
•verbose:是否显示详细的信息

  

   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:如果失败,这里可以有失败原因,不过从经验上来看,原因比较模糊,作用不大

 

 

 

分享到:
评论

相关推荐

    MapReduceMongoDB:在 MongoDB 中使用 Map reduce

    标题:在 MongoDB 中使用 Map Reduce 检查波兰语和英语句子中的字母分布 动机 我们越来越多地听到各种网站遭到攻击以及密码非常薄弱的​​管理员的不负责任。 如何创建一个强密码:有一种观点认为你应该造一个句子,...

    Loggio:Java Bases Log Framework with Elastic Search Distributed Architecture & MongoDB Map Reduce based Recommendation Logging

    Java Bases Log Framework with Elastic Search Distributed Architecture & MongoDB Map Reduce based Recommendation Logging 建筑学 建筑学 弹性搜索 MongoDB 和 Map Reduce 部署说明 要快速使用 Loggio,您必须...

    mongodb-win32-x86_64-2008plus-ssl-v3.4-latest-signed.msi

    Mongodb中的Map/reduce主要是用来对数据进行批量处理和聚合操作。 Map和Reduce。Map函数调用emit(key,value)遍历集合中所有的记录,将key与value传给Reduce函数进行处理。 Map函数和Reduce函数是使用Javascript...

    MongoDB中MapReduce的使用方法详解

    前言 玩过Hadoop的小伙伴对...mapreduce其实是分批处理数据的,每一百次重新reduce处理,所以到reduce里的数据如果是101条,那就会分2次进入。 这导致的问题就是在reduce中 如果 初始化 var count = 0;在循环中 c

    Mongo-Commands:MongoDB命令速查表。 包含map-reduce,aggregate等

    Mongo-Commands:MongoDB命令速查表。 包含map-reduce,aggregate等

    MongoDB in Action

    It blends the things you expect with any database--like indexing, querying, and high availability--with powerful new features like easy horizontal scaling ('auto-sharding'), map/reduce aggregation, ...

    MongoDB学习笔记之MapReduce使用示例

    Map-Reduce是一种计算模型,简单的说就是将大批量的工作(数据)分解(MAP)执行,然后再将结果合并成最终结果(REDUCE)。 使用 MapReduce 要实现两个函数 Map 函数和 Reduce 函数, Map 函数调用 emit(key, value),...

    Mongodb中MapReduce实现数据聚合方法详解

    Mongodb是针对大数据量环境下诞生的用于保存大数据量的非关系型数据库,针对大量的数据,如何进行统计操作至关重要,那么如何从Mongodb中统计一些数据呢?...其中map函数用于对集合中的各个满足条件的文档

    深入云计算 MongoDB管理与开发实战详解pdf.part1

    7.1 Map函数 7.2 Reduce函数 7.3 结果存储 7.4 对Reduce函数结果进一步处理 7.5 其他控制细节 7.6 本章小结 第3篇 管理篇 第8章 管理 8.1 启动和停止MongoDB 8.1.1 使用命令行启动 8.1.2 配置...

    mongodb mapreduce 实例

    mongodb mapreduce 实例,该例子主要用来做订单统计的。具体问题请到博客提问。

    mongodb-java-testing:MongoDB Java测试

    以人易读的形式进行Map Reduce 因为Java缺少一种声明多行字符串的优雅方法,所以我在这里添加了map和reduce函数: 地图 function () { this.categories.forEach(function (category) { emit(category, { count: 1 })...

    MongoDB、PIG、HIVE Storage、Map Reduce、Spark、Yarn性能分析模拟-研究论文

    Hadoop、Map Reduce 等工具能够管理如此庞大的数据量。 与此一起,Apache Hive、No SQL 也是这种收费。 信息提取被认为是必不可少的。 其原因在于非结构化文本数据的快速增长。 因此,它被认为是一个计算密集型和 ...

    MongoDB For Linux v2.2.1 rc1

    MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。他支持的数据结构非常松散,是类似json的bjson格式,因此可以存储比较复杂...Map Reduce;新的查询特性等等。

    MongoDBHadoopStockInfo:这个项目实现了 Sharding MongoDB config 和 Connected MongoDB with Hadoop

    该项目使用分布式分片MongoDB作为数据存储和Hadoop Map Reduce作为计算框架。 ####系统遵循以下程序: 分片 MongoDB 设计(保证可用性、负载平衡) MongoDB 存储和设置主服务器和其他服务器地址列表为 ...

    深入云计算 MongoDB管理与开发实战详解pdf.part2

    7.1 Map函数 7.2 Reduce函数 7.3 结果存储 7.4 对Reduce函数结果进一步处理 7.5 其他控制细节 7.6 本章小结 第3篇 管理篇 第8章 管理 8.1 启动和停止MongoDB 8.1.1 使用命令行启动 8.1.2 配置...

    studio3t 安装文件

    mongodb数据库的可视化操作插件,类似mysql一样,内部提供各种各样的函数,以及聚合,map-reduce等快速查询方法。

    MongoDB中的MapReduce简介

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

    mongo-project:探索 MongoDB!

    JavaScript 开发者第一次,可以 hack 自己喜欢的前端框架(Angular、React、Polymer、ExtJS),可以做服务器端(Node.JS + Expresss MVC)和做数据库编程(MongoDB Map/Reduce聚合和分析),全部使用一种语言,无需...

    ecommerce:使用MongoDB,Hadoop大数据和Spring技术开发电子商务应用程序

    使用MongoDB,Hadoop大数据和Spring技术开发电子商务应用程序该电子商务项目展示了如何... 已开发的Map / Reduce作业在MongoDB和Ubuntu平台上运行。 Spring和Spring Boot技术用于为电子商务应用程序提供系统集成平台。

Global site tag (gtag.js) - Google Analytics