MongoDB(课时29 MapReduce)
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)的更多相关文章
- 【转载】MongoDB中的MapReduce 高级操作介绍
转载自残缺的孤独 1.概述 MongoDB中的MapReduce相当于关系数据库中的group by.使用MapReduce要实现两个函数Map和Reduce函数.Map函数调用emit(key,va ...
- MongoDB中的MapReduce介绍与使用
一.简介 在用MongoDB查询返回的数据量很大的情况下,做一些比较复杂的统计和聚合操作做花费的时间很长的时候,可以用MongoDB中的MapReduce进行实现 MapReduce是个非常灵活和强大 ...
- 基于MongoDB分布式存储进行MapReduce并行查询
中介绍了如何基于Mongodb进行关系型数据的分布式存储,有了存储就会牵扯到查询.虽然用普通的方式也可以进行查询,但今天要介绍的是如何使用MONGODB中提供的MapReduce功能进行查询. ...
- MongoDB中通过MapReduce实现合计Sum功能及返回格式不一致问题分析
建立下述测试数据,通过MapReduce统计每个班级学生数及成绩和. 代码如下: public string SumStudentScore() { var collection = _dataBas ...
- MongoDB整理笔记のMapReduce
MongDB的MapReduce相当于MySQL中的“group by”,所以在MongoDB上使用Map/Reduce进行并行“统计”很容易. 使用MapReduce要实现两个函数Map函数和Red ...
- MongoDB (课时1,2)
1.数据库之中支持的的SQL语句是由IBM开发出来的,使用并不麻烦,就是几个简单的单词:select, from, where, group by, having, order by.目前最流行的数 ...
- 面向对象程序设计-C++_课时28静态对象_课时29静态成员
Static in C++ Two basic meanings Static Storage --allocated once at a fixed address Visibility of a ...
- mongoDB(3) mapReduce
mapReduce是大数据的核心内容,但实际操作中别用这个,所谓的mapReduce分两步 1.map:将数据分别取出,Map函数调用emit(key,value)遍历集合中所有的记录,将key与va ...
- mongodb学习3---mongo的MapReduce
1,概述MapReduce是个非常灵活和强大的数据聚合工具.它的好处是可以把一个聚合任务分解为多个小的任务,分配到多服务器上并行处理.MongoDB也提供了MapReduce,当然查询语肯定是Java ...
随机推荐
- Locust性能测试2-先登录场景案例
前言 有很多网站不登录的话,是无法访问到里面的页面的,这就需要先登录了 实现场景:先登录(只登录一次),然后访问页面->我的地盘页->产品页->项目页 官方案例 下面是一个简单的lo ...
- jmeter处理带表单的接口请求
如何用jmeter处理带选项的表单接口请求 下面是用到了F12 抓包的处理方法 下图是直接手动在页面上请求的结果 下面就是采用F12抓包抓到url 和FormData 分别把上面获取的url和Form ...
- Django实现cookie&session以及认证系统
COOKIE&SESSION 知识储备 由于http协议无法保持状态,但实际情况,我们却又需要“保持状态”,因此cookie就是在这样一个场景下诞生. cookie的工作原理是:由服务器产生内 ...
- js随机点名系统
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- #C语言初学记录(位运算)
位运算 Problem Description7-1 数组元素循环右移问题 一个数组A中存有N(>0)个整数,在不允许使用另外数组的前提下,将每个整数循环向右移M(≥0)个位置,即将A中的数据由 ...
- sql 各种锁
SELECT * FROM table WITH (HOLDLOCK) 注意: 锁定数据库的一个表的区别 SELECT * FROM table WITH (HOLDLOCK) 其他事务可以读取表,但 ...
- 20155334 2016-2017-2 《Java程序设计》第八周学习总结
20155334 2016-2017-2 <Java程序设计>第八周学习总结 教材学习内容总结 第十四章:NIO与NIO2 NIO的定义: InputStream.OutputStream ...
- linux常用命令:find 命令概览
Linux下find命令在目录结构中搜索文件,并执行指定的操作.Linux下find命令提供了相当多的查找条件,功能很强大.由于find具有强大的功能,所以它的选项也很多,其中大部分选项都值得我们花时 ...
- python3.4学习笔记(二十六) Python 输出json到文件,让json.dumps输出中文 实例代码
python3.4学习笔记(二十六) Python 输出json到文件,让json.dumps输出中文 实例代码 python的json.dumps方法默认会输出成这种格式"\u535a\u ...
- QAQ的LIS树 QAQ的LIS树2 题解报告
这两道题实际上考试的时候是一道题OwO 太可怕了,忙了我三个多小时,写了整整7K 这个题两个询问关联性不强,所以分开来考虑 QAQ的LIS树 考虑如何用dp求解答案 设dp(v)表示v到根的修改后的序 ...