`
chenhua_1984
  • 浏览: 1253887 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

mongodb的MapReduce学习

阅读更多

     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" } }
   
      上面是按性别来分组,找出人,假如要算出男女个多少个,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分享.ppt

    在这个“MongoDB MapReduce 分享”中,我们将深入探讨 MapReduce 在 MongoDB 中的应用及其核心概念。 MapReduce 包含两个主要函数:Map 和 Reduce。Map 阶段负责将输入数据分解成小块,然后对每一块应用一个函数,...

    mongodb mapreduce 实例

    MongoDB的MapReduce是一个强大的工具,它允许用户在数据库中执行复杂的聚合操作,尤其是处理大数据集时。在这个实例中,我们将探讨如何利用MapReduce来统计订单数据,这在电子商务平台如“CShop”中是非常常见的需求...

    MongoDB中MapReduce的使用方法详解

    MongoDB的MapReduce是一种强大的工具,用于处理和分析大量数据,尤其适合于复杂的数据聚合任务。MapReduce的工作原理是将大规模数据集分解成小块,分别在不同的节点上执行计算,然后将结果合并以得到最终答案。在...

    MongoDB中的MapReduce简介

    MongoDB的MapReduce功能是基于分布式计算模型的一种数据处理方式,它允许用户在数据库中进行大规模数据处理。MapReduce的核心思想是将复杂的数据处理任务分解为两个主要阶段:Map阶段和Reduce阶段。 Map阶段是数据...

    MongoDB的MapReduce.pdf

    MongoDB的MapReduce是一种在大型数据集上进行并行计算的编程模型,尤其适用于数据分析任务。MapReduce由Google提出,其灵感来源于函数式编程语言中的Map和Reduce概念,旨在简化分布式计算,使得开发者无需深入理解...

    计算机后端-PHP视频教程. mongodb10 MapReduce 统计栏目下的商品.wmv

    计算机后端-PHP视频教程. mongodb10 MapReduce 统计栏目下的商品.wmv

    MongoDB与Hadoop MapReduce的海量非结构化数据处理方案.pdf

    MongoDB与Hadoop MapReduce的海量非结构化数据处理方案 本文旨在探索基于MongoDB与Hadoop MapReduce的海量非结构化数据处理方案,旨在解决大数据时代下的数据处理难题。该方案通过MongoDB Cluster、MongoDB-...

    MongoDB学习笔记

    学习MongoDB不仅需要理解其基本的数据操作和管理,还需要了解其高级特性、集群部署、索引机制、日志系统、数据备份与恢复等方面的知识。接下来将基于提供的文件内容详细展开介绍MongoDB的相关知识点。 一、入门 1. ...

    Hadoop&MongoDB;学习资料

    3. **MapReduce编程**:学习Java编程,实现MapReduce作业,理解数据分片、Map函数、Shuffle过程和Reduce函数。 4. **YARN**:下一代资源调度器,用于管理和分配集群资源,取代了最初的JobTracker。 5. **Hadoop生态*...

    MongoDB学习笔记之MapReduce使用示例

    MongoDB的MapReduce是一个强大的工具,它允许开发者处理和聚合大量数据。MapReduce基于一种分布式计算模型,将大规模数据处理任务分解为两步:Map(映射)和Reduce(归约)。在这个过程中,MongoDB首先应用Map函数...

    Mongodb 视频

    在这个“MongoDB视频”学习资源中,你将能够从基础到精通,全方位地掌握MongoDB的相关知识。 一、MongoDB基础 MongoDB的基础部分涵盖了数据库、集合、文档、查询等核心概念。数据库是存储数据的地方,类似于关系型...

    计算机后端-PHP视频教程. mongodb09 MapReduce 概念.wmv

    计算机后端-PHP视频教程. mongodb08 导出导入.wmv

    mongodb学习手册.rar

    本"mongodb学习手册"提供了全面且清晰的指导,适合初学者和有一定经验的开发者深入理解MongoDB的核心概念和技术。 在手册中,你可能会遇到以下关键知识点: 1. **MongoDB基础**:首先,你会了解到MongoDB的基本...

    MongoDB入门学习

    ### MongoDB入门学习知识点详解 #### 一、MongoDB简介与特点 MongoDB是一款非常流行的开源文档型NoSQL数据库系统,采用C++语言实现,具备高度的可扩展性和高性能。它适用于处理大规模的数据集,并提供了丰富的功能...

    Mongodb学习笔记.docx

    MongoDB 学习笔记 本文档是 MongoDB 学习笔记,涵盖了 NoSQL、Cache、运行平台等多个方面的知识点。 一、NoSQL 数据库 MongoDB MongoDB 是一个强大、灵活、可扩展性好的文档数据存储器,可以完成大部分关系数据库...

Global site tag (gtag.js) - Google Analytics