3.7.4 MapReduce

MapReduce 是整个大数据的精髓所在(实际中别用,因为在MongoDB中属于最底层操作)。

MapReduce是一种计算模型,简单的说就是将大批量的工作分解执行,然后再将结果合并成最终结果。

MapReduce 就是分为两步处理数据:

  • Map:将数据分别取出
  • Reduce:负责数据的最后的处理

范例:建立一组雇员数据

db.emps.insert({"name": "张三", "age": , "sex": "男", "job": "CLERK", "salary": });
db.emps.insert({"name": "李四", "age": , "sex": "女", "job": "CLERK", "salary": });
db.emps.insert({"name": "王五", "age": , "sex": "男", "job": "MANAGER", "salary": });
db.emps.insert({"name": "赵六", "age": , "sex": "女", "job": "MANAGER", "salary": });
db.emps.insert({"name": "孙七", "age": , "sex": "男", "job": "CLERK", "salary": });
db.emps.insert({"name": "王八", "age": , "sex": "女", "job": "PRESIDENT", "salary": });

范例:按照职位分组,取得每个职位的人名

第一步:编写分组的定义(即Map函数):

    var jobMapFun = function(){

      emit(this.job, this.name);   //emit()函数表示每行数据按照job分组,取出name

    }; 

分析:

  • Map函数调用emit(key, value),遍历emps中所有的记录,将key与value传递给Reduce函数进行处理,
  • Map函数必须调用emit(key, value)返回的键值对。
  • emit()函数是按数据的分组走,比如第一组:{key : "CLERK", values : [姓名, 姓名,...]}

第二步:编写 reduce 操作:

    var jobReduceFun = function(key, values){

      return {"job": key, "names": values};

    }  

分析:reduce统计函数,reduce函数的任务是将key-values变为key-value,也就是把values数组变为一个单一的值value。

第三步:进行操作的整合:

db.runCommand({
"mapreduce": "emps",
"map": jobMapFun,
"reduce": jobReduceFun,
"out": "t_job_emp"
});

分析:out:统计结果存放集合(不指定则使用临时集合,在客户端断开后自动删除)

执行后所有结果都保存在"t_job_emp"集合里面。

或者将上面第三步换成如下第三步和第四步

第三步:针对MapReduce处理完成的数据实际上也可以执行一个最后的处理

var jobFinalizeFun = function(key, values){
if(key == "PRESIDENT"){
return {"job": key, "names": values, "info": "公司的老大"};
}
return {"job": key, "names": values};
}

第四步:进行操作的整合

db.runCommand({
"mapreduce": "emps",
"map": jobMapFun,
"reduce": jobReduceFun,
"out": "t_job_emp",
"finalize": jobFinalizeFun
});

现在执行之后,所有的处理结果都保存在 “t_job_emp” 集合里面,通过如下命令查看

db.t_job_emp.find()

范例:统计出性别的人数、平均工资、最低工资、雇员姓名。

var sexMapFun = function(){
  // 定义好了分组的条件,以及每个集合要取出的内容
  emit(this.sex, {"ccount" : , "csal" : this.salary, "cmax" : this.salary, "cmin" : this.salary, "cname" : this.name})
}
var sexReduceFun = function(key, values){
  var total = ;  //统计
  var sum = ;  //计算总工资
  var max = values[].cmax;  //假设第一个数据是最高工资
  var min = values[].cmin;  //假设第一个数据是最低工资
  for (var x in values){      // 表示循环取出里面的数据
    total += values[x].ccount;  //人数增加
    sum += values[x].csal;    //就可以循环取出所有的工资,并且累加
    if (max < values[x].cmax){  //不是最高工资
      max = values[x].cmax;
    }
    if (min > values[x].cmin){  //不是最低工资
      min = values[x].cmin;
    }
    names[x] = values[x].cname  //保存姓名
  }
  var avg = (sum / total).toFixed();  //toFixed(2)设置成两位小数
  //返回数据的处理结果
  return {"count" : total, "avg" : avg, "sum" : sum, "max" : max, "min" : min, "names" : names};
}
db.runCommand({
  "mapreduce" : "emps",
  "map" : sexMapFun,
  "reduce" : sexReduceFun,
  "out" : "t_sex_emp"
})

现在执行之后,所有的处理结果都保存在“t_sex_emp”集合里面,通过如下命令查看:

db.t_sex_emp.find()

MongoDB(课时29 MapReduce)的更多相关文章

  1. 【转载】MongoDB中的MapReduce 高级操作介绍

    转载自残缺的孤独 1.概述 MongoDB中的MapReduce相当于关系数据库中的group by.使用MapReduce要实现两个函数Map和Reduce函数.Map函数调用emit(key,va ...

  2. MongoDB中的MapReduce介绍与使用

    一.简介 在用MongoDB查询返回的数据量很大的情况下,做一些比较复杂的统计和聚合操作做花费的时间很长的时候,可以用MongoDB中的MapReduce进行实现 MapReduce是个非常灵活和强大 ...

  3. 基于MongoDB分布式存储进行MapReduce并行查询

    中介绍了如何基于Mongodb进行关系型数据的分布式存储,有了存储就会牵扯到查询.虽然用普通的方式也可以进行查询,但今天要介绍的是如何使用MONGODB中提供的MapReduce功能进行查询.     ...

  4. MongoDB中通过MapReduce实现合计Sum功能及返回格式不一致问题分析

    建立下述测试数据,通过MapReduce统计每个班级学生数及成绩和. 代码如下: public string SumStudentScore() { var collection = _dataBas ...

  5. MongoDB整理笔记のMapReduce

    MongDB的MapReduce相当于MySQL中的“group by”,所以在MongoDB上使用Map/Reduce进行并行“统计”很容易. 使用MapReduce要实现两个函数Map函数和Red ...

  6. MongoDB (课时1,2)

    1.数据库之中支持的的SQL语句是由IBM开发出来的,使用并不麻烦,就是几个简单的单词:select, from, where,  group by, having, order by.目前最流行的数 ...

  7. 面向对象程序设计-C++_课时28静态对象_课时29静态成员

    Static in C++ Two basic meanings Static Storage --allocated once at a fixed address Visibility of a ...

  8. mongoDB(3) mapReduce

    mapReduce是大数据的核心内容,但实际操作中别用这个,所谓的mapReduce分两步 1.map:将数据分别取出,Map函数调用emit(key,value)遍历集合中所有的记录,将key与va ...

  9. mongodb学习3---mongo的MapReduce

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

随机推荐

  1. [LeetCode] 181. Employees Earning More Than Their Managers_Easy tag: SQL

    The Employee table holds all employees including their managers. Every employee has an Id, and there ...

  2. 8款世界级Webmail工具推荐

    Webmail软件或者基于Web的电子邮件包含两个重要方面:Webmail客户端和Webmail提供商.Webmail客户端负责通过本地或远程服务器使用POP3和SMTP协议发送和接收电子邮件.Web ...

  3. 机器学习理论基础学习16---高斯网络(GN)

    一.高斯网络(高斯图模型)总体介绍 概率图模型分为三种:贝叶斯网络,马尔科夫随机场以及高斯网络:而高斯网络又可以根据有向无向细分为高斯贝叶斯网络和高斯马尔科夫随机场 二.高斯贝叶斯网络 1.高斯贝叶斯 ...

  4. 梯度消失与梯度爆炸 ==> 如何选择随机初始权重

    梯度消失与梯度爆炸 当训练神经网络时,导数或坡度有时会变得非常大或非常小,甚至以指数方式变小,这加大了训练的难度 这里忽略了常数项b.为了让z不会过大或者过小,思路是让w与n有关,且n越大,w应该越小 ...

  5. 关闭WPS启动时显示的在线模板

    关闭WPS启动时显示的在线模板 以WPS2016为例,如下图: 操作步骤如下: ①点击在线模板页面右下方的"设置"选项 ②"设置"界面打开后,选择启动WPS默认 ...

  6. linux系统安装 dig和nslookup命令

    Fedora / Centos:1.yum install bind-utils Ubuntu: 1.sudo apt-get install dnsutils Debian: 1.2 apt-get ...

  7. MDX导航结构层次:《Microsoft SQL Server 2008 MDX Step by Step》学习笔记九

    <Microsoft SQL Server 2008 MDX Step by Step>学习笔记九:导航结构层次   SQL Server 2008中SQL应用系列及BI笔记系列--目录索 ...

  8. potplayer启动慢的各种奇葩原因

    此博文可能会持续更新,因为启动慢的原因各种奇葩啊 1.声卡(螃蟹卡)驱动导致的启动慢.解决方法:potplayer中,"选项"->"声音"->修改一 ...

  9. sql server2012重复执行创建表视图sql及带行号的视图

    1.可重复操作(创建表,视图)的sql语句判断 IF EXISTS ( SELECT * FROM sys.foreign_keys WHERE object_id = OBJECT_ID(N'[re ...

  10. UVM中的factory机制实现

    首先在Systemverilog中便有对于重载的最基本的支持. 1)定义task/function时,使用virtual关键字.那之后在test_case中调用时,便使用句柄指向的对象的类型而不是句柄 ...