`

【赵强老师】在MongoDB中使用MapReduce方式计算聚合

阅读更多

MapReduce 能够计算非常复杂的聚合逻辑,非常灵活,但是,MapReduce非常慢,不应该用于实时的数据分析中。MapReduce能够在多台Server上并行执行,每台Server只负责完成一部分wordload,最后将wordload发送到Master Server上合并,计算出最终的结果集,返回客户端。
MapReduce的基本思想,如下图所示:

在这个例子中,我们以一个求和为例。首先执行Map阶段,把一个大任务拆分成若干个小任务,每个小任务运行在不同的节点上,从而支持分布式计算,这个阶段叫做Map(如蓝框所示);每个小任务输出的结果再进行二次计算,最后得到结果55,这个阶段叫做Reduce(如红框所示)。

使用MapReduce方式计算聚合,主要分为三步:Map,Shuffle(拼凑)和Reduce,Map和Reduce需要显式定义,shuffle由MongoDB来实现。

  • Map:将操作映射到每个doc,产生Key和Value
  • Shuffle:按照Key进行分组,并将key相同的Value组合成数组
  • Reduce:把Value数组化简为单值

我们以下面的测试数据(员工数据)为例,来为大家演示。

db.emp.insert(
[
{_id:7369,ename:'SMITH' ,job:'CLERK'    ,mgr:7902,hiredate:'17-12-80',sal:800,comm:0,deptno:20},
{_id:7499,ename:'ALLEN' ,job:'SALESMAN' ,mgr:7698,hiredate:'20-02-81',sal:1600,comm:300 ,deptno:30},
{_id:7521,ename:'WARD'  ,job:'SALESMAN' ,mgr:7698,hiredate:'22-02-81',sal:1250,comm:500 ,deptno:30},
{_id:7566,ename:'JONES' ,job:'MANAGER'  ,mgr:7839,hiredate:'02-04-81',sal:2975,comm:0,deptno:20},
{_id:7654,ename:'MARTIN',job:'SALESMAN' ,mgr:7698,hiredate:'28-09-81',sal:1250,comm:1400,deptno:30},
{_id:7698,ename:'BLAKE' ,job:'MANAGER'  ,mgr:7839,hiredate:'01-05-81',sal:2850,comm:0,deptno:30},
{_id:7782,ename:'CLARK' ,job:'MANAGER'  ,mgr:7839,hiredate:'09-06-81',sal:2450,comm:0,deptno:10},
{_id:7788,ename:'SCOTT' ,job:'ANALYST'  ,mgr:7566,hiredate:'19-04-87',sal:3000,comm:0,deptno:20},
{_id:7839,ename:'KING'  ,job:'PRESIDENT',mgr:0,hiredate:'17-11-81',sal:5000,comm:0,deptno:10},
{_id:7844,ename:'TURNER',job:'SALESMAN' ,mgr:7698,hiredate:'08-09-81',sal:1500,comm:0,deptno:30},
{_id:7876,ename:'ADAMS' ,job:'CLERK'    ,mgr:7788,hiredate:'23-05-87',sal:1100,comm:0,deptno:20},
{_id:7900,ename:'JAMES' ,job:'CLERK'    ,mgr:7698,hiredate:'03-12-81',sal:950,comm:0,deptno:30},
{_id:7902,ename:'FORD'  ,job:'ANALYST'  ,mgr:7566,hiredate:'03-12-81',sal:3000,comm:0,deptno:20},
{_id:7934,ename:'MILLER',job:'CLERK'    ,mgr:7782,hiredate:'23-01-82',sal:1300,comm:0,deptno:10}
]
);

 

 

(案例一)求员工表中,每种职位的人数

var map1=function(){emit(this.job,1)}
var reduce1=function(job,count){return Array.sum(count)}
db.emp.mapReduce(map1,reduce1,{out:"mrdemo1"})

 

 

(案例二)求员工表中,每个部门的工资总和

var map2=function(){emit(this.deptno,this.sal)}
var reduce2=function(deptno,sal){return Array.sum(sal)}
db.emp.mapReduce(map2,reduce2,{out:"mrdemo2"})

 

 

(案例三)Troubleshoot the Map Function

定义自己的emit函数:
var emit = function(key, value) {
print("emit");
print("key: " + key + "  value: " + tojson(value));
}

测试一条数据:
emp7839=db.emp.findOne({_id:7839})
map2.apply(emp7839)
输出以下结果:
emit
key: 10  value: 5000

测试多条数据:
var myCursor=db.emp.find()
while (myCursor.hasNext()) {
    var doc = myCursor.next();
    print ("document _id= " + tojson(doc._id));
    map2.apply(doc);
    print();
}

 

 

(案例四)Troubleshoot the Reduce Function

一个简单的测试案例
var myTestValues = [ 5, 5, 10 ];
var reduce1=function(key,values){return Array.sum(values)}
reduce1("mykey",myTestValues)

测试:Reduce的value包含多个值
测试数据:薪水、奖金:
var myTestObjects = [
                      { sal: 1000, comm: 5 },
                      { sal: 2000, comm: 10 },
                      { sal: 3000, comm: 15 }
                    ];
开发reduce方法:
var reduce2=function(key,values) {
   reducedValue = { sal: 0, comm: 0 };
   for(var i=0;i<values.length;i++) {
     reducedValue.sal += values[i].sal;
     reducedValue.comm += values[i].comm;
   }  
   return reducedValue;
}

测试:
reduce2("aa",myTestObjects)

 

 

分享到:
评论

相关推荐

    10天掌握MongoDB

    文档是MongoDB中最基础的数据单位,它以BSON(一种类似于JSON的二进制编码格式)格式存储。BSON格式的数据能够有效地在应用程序和数据库之间传输,并且支持多种数据类型,包括嵌套的文档和数组。 此外,MongoDB还...

    传智播客 赵强 Oracle课件

    在赵强老师的课程中,你可以学到以下几个重要的Oracle知识点: 1. **Oracle基础知识**:了解Oracle的历史、版本以及其在企业级应用中的重要性。学习数据库的概念、数据模型(如关系型模型)以及数据库管理系统...

    赵强老师的Oracle课件

    想要好好地学习Oracle数据库的朋友呀,你错过了她就太不值得了。里面有好多的Oracle操作命令可能你都没接触过吧。好了,话不多多说。坚信资料不错!你,值得拥有!OK.还有,之所有要你2分打赏,是我给了你这么好的...

    精通JSP编程 作者赵强

    5. **第8章** - 可能会涉及JavaBeans组件,这是在JSP中封装业务逻辑和数据的常用方式。这一章可能会讲述如何创建、配置和使用JavaBeans,以及如何通过JSP标签进行调用。 6. **第9章** - 该章节可能涵盖JSP的页面...

    精通JSP编程 作者赵强 编

    精通JSP编程 作者赵强 编 12-18节

    Oracle学习笔记(传智播客 赵强)

    3. **优先使用WHERE子句**:优化查询时,应尽量减少在FROM和WHERE子句之间的计算,把过滤条件尽可能地放在WHERE子句中。 4. **自连接优化**:对于基于树状结构的数据表,层次查询可以有效地进行自连接查询。例如,...

    [1120][赵强精通JSP编程][37M]

    根据描述中的信息,可以通过以下几种方式获取赵强的《精通JSP编程》这本书的资料: - **下载地址**:提供了一个链接,虽然链接格式不正确,但可以通过修改后访问获取资料的网站。 - **作者联系方式**:提供了QQ号...

    Oracle数据库赵强视频教程【3天】

    教程名称:Oracle 数据库赵强视频教程【3天】教程目录:【】Oracle安装与管理、SQL语句(赵强)【】Orcale存储过程jdbc与Orcale大文本操作等(赵强)【】SQL...资源太大,传百度网盘了,链接在附件中,有需要的同学自取。

    二年级数学生活中的大数赵强PPT课件.pptx

    这些实例都是为了让学生在实际情境中感知大数,并了解它们在我们生活中的应用。 课件的第16页开始引入了数位的概念,通过填空的形式让学生理解“个”、“十”、“百”、“千”的进制关系,比如10个一是10,10个十是...

    二年级数学生活中的大数赵强PPT学习教案.pptx

    这篇PPT学习教案主要针对二年级的学生,旨在教授他们在生活中如何理解和使用大数。课程以实际生活中的例子引入,帮助孩子们建立起对大数的概念。首先,提到我们可以用肉眼观察到大约三千颗星星,这是一个直观的大数...

    ADS设计威尔金森功分器步骤详解

    - **通带内传输损耗**:指信号在功分器内部传输过程中的能量损失,应保持在较低水平,设计目标通常不超过3.1dB。 - **通带内功分比**:指功分器将输入功率按预定比例分配到多个输出端口的能力,常见的功分比为1:1。 ...

    LoadRunner性能测试巧匠训练营-完整版(带目录)-赵强邹伟伟

    《LoadRunner性能测试巧匠训练营》是一本深入讲解LoadRunner性能测试的教材,由赵强和邹伟伟两位专家共同编著。该资源提供的是完整版,且无需密码即可解压阅读,对于想要学习和提升LoadRunner性能测试技能的人来说,...

    day2013-0110-webLogic配置和集群(赵强).zip

    2. 创建集群:在WebLogic管理控制台中,创建一个新的集群,为每个成员服务器指定主机名和端口,并配置集群间的通信设置。 3. 部署到集群:应用部署到集群时,会自动复制到所有集群成员,确保所有节点都能处理请求。...

    java代码-46 赖赵强

    在本项目中,标题"java代码-46 赖赵强"暗示了这是一个与Java编程相关的代码示例,可能是由一个名叫赖赵强的开发者编写的。在Java编程领域,这种命名通常是为了记录个人的学习过程或者项目经历。描述中的内容相同,...

    信息存储技术的发展赵强.doc

    自20世纪开始,随着“万物皆可数”的理念推动,信息技术逐渐从计算和网络中心转向以数据为中心,存储的重要性日益凸显。 存储技术的昨天,主要围绕着信息的记录和传播方式进行创新。从早期的物理形态记录,如岩画和...

    java代码-46赖赵强 求数组的最大值,最小值,平均值

    在这个项目中,“java代码-46赖赵强 求数组的最大值,最小值,平均值”显然是一个简单的教学实例,用于教授初学者如何在Java中处理这些基本的数值计算。 首先,我们来看`main.java`这个文件,它通常包含了程序的主...

Global site tag (gtag.js) - Google Analytics