MongoDB 数据操作(七)聚合(4)MapReduce
in SQL with 0 comment, Views is 40

MongoDB 数据操作(七)聚合(4)MapReduce

in SQL with 0 comment, Views is 40

上一篇:《MongoDB 数据操作(七)聚合(3)group操作》

MapReduce 是整个大数据的精髓所在(实际中别用),所谓的 MapReduce 就是分为两步处理数据:

1、Map:将数据分别取出

2、Reduce:负责数据的处理

可是在 MongoDB 里面实现 MapReduce 处理,复杂度是相当高的

建立一组雇员数据

> db.emps.insert({"name": "张三", "age": 30, "sex": "男", "job": "CLERK", "salary": 1000});
> db.emps.insert({"name": "李四", "age": 28, "sex": "女", "job": "CLERK", "salary": 5000});
> db.emps.insert({"name": "王五", "age": 26, "sex": "男", "job": "MANAGER", "salary": 6000});
> db.emps.insert({"name": "赵六", "age": 32, "sex": "女", "job": "MANAGER", "salary": 7000});
> db.emps.insert({"name": "孙七", "age": 31, "sex": "男", "job": "CLERK", "salary": 2000});
> db.emps.insert({"name": "王八", "age": 35, "sex": "女", "job": "PRESIDENT", "salary": 9000});

使用 MapReduce 操作最终会将处理结果保存在一个单独的集合里面,而最终的处理效果如下:

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

1、编写分组定义

> var jobMapFun = function () {
      emit(this.job, this.name); // 按 job 分组取出 name
  }

2、编写 Reduce 操作

> var jobReduceFun = function (key, values) {
      return {"job": key, "names": values};
  }

3、操作整合(1)

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

1.png

执行之后,所有的处理结果都保存在了 t_job_names_emps 集合里面

2.png

4、针对 MapReduce 处理完成的数据实际上也可以执行一个最后处理

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

5、操作整合(2)

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

3.png

查看 t_job_emps 集合

4.png

统计出各性别的人数、平均工资、最高工资、最低工资、雇员姓名

> var sexMapFun = function () {
      // 定义分组条件,以及每个集合需要取出的内容
      emit(this.sex, {
              "c_count": 1,
              "c_sal": this.salary,
              "c_max": this.salary,
              "c_min": this.salary,
              "c_name": this.name});
  }
> var sexReduceFun = function (key, values) {
      var total = 0;             // 统计人数
      var sum = 0;               // 计算总工资
      var max = values[0].c_max; // 最大工资
      var min = values[0].c_min; // 最小工资
      var names = new Array();   // 定义姓名数组
      for (var x in values) { // 表示循环取出里面的数据
          total += values[x].c_count; // 认数增加
          sum += values[x].c_sal;     // 所有人工资总和
          max = max < values[x].c_max ? values[x].c_max : max; // 最大工资
          min = min > values[x].c_min ? values[x].c_min : min; // 最小工资
          names[x] = values[x].c_name;
      }
      var avg = (sum / total).toFixed(2); // 平均值
      // 返回数据处理结果
      return {"count": total, "avg": avg, "max": max, "min": min, "names": names};
  }
> db.runCommand({
      "mapreduce": "emps",
      "map": sexMapFun,
      "reduce": sexReduceFun,
      "out": "t_sex_emps"
  });

5.png

6.png

虽然大数据时代提供有强悍的 MapReduce 支持,但是从实际开发来讲,过于耗时很少使用

下一篇:《MongoDB 数据操作(八)聚合框架(1)$group》

Responses
选择表情