mongoDB(3) mapReduce
mapReduce是大数据的核心内容,但实际操作中别用这个,所谓的mapReduce分两步
1.map:将数据分别取出,Map函数调用emit(key,value)遍历集合中所有的记录,将key与value传给Reduce函数进行处理
2.reduce:负责数据的最后处理,function(key,value){} 参数是map传来的key和value
Mongodb中的Map/reduce主要是用来对数据进行批量处理和聚合操作,有点类似于使用Hadoop对集合数据进行处理,所有输入数据都是从集合中获取,而MapReduce后输出的数据也都会写入到集合中。通常类似于我们在SQL中使用Group By语句一样。
在mongodb中实现mapReduce是复杂度相当高的。
Map函数和Reduce函数是使用Javascript编写的,并可以通过db.runCommand或mapreduce命令来执行MapReduce操作.
db.runCommand(
{ mapreduce : <collection>,
map : <mapfunction>,
reduce : <reducefunction>,
out : <see output options below>
[, query : <query filter object>]
[, sort : <sorts the input objects using this key. Useful for optimization, like sorting by the emit key for fewer reduces>]
[, limit : <number of objects to return from collection, not supported with sharding>]
[, keeptemp: <true|false>]
[, finalize : <finalizefunction>]
[, scope : <object where fields go into javascript global scope >]
[, jsMode : true]
[, verbose : true]
}
);
参数讲解:
mapreduce:要操作的目标集合
map:映射函数(生成键值对序列,作为Reduce函数的参数)
reduce:统计函数
query:目标记录过滤
sort:对目标记录排序
limit:限制目标记录数量
out:统计结果存放集合(如果不指定则使用临时集合,在客户端断开后自动删除)
keeptemp:是否保留临时集合
finalize:最终处理函数(对reduce返回结果执行最终整理后存入结果集合)
scope:向map、reduce、finalize导入外部变量
verbose:显示详细的时间统计信息
/*
* 1.map:定义好分组的条件,以及每个集合要取出来的内容
* emit传给了reduce的{key,[value1,value2,value3,……]}
* 2.{sex:'sex'+ this.sex,name:'333'+this.name} 取出来的所有的内容,都给了values [{},{},{},{},{}]
* 3.reduce的key,values,
* key:是emit的第一个值,{sex:this.sex,name:this.name}
* values: 是emit的第二个组成的数组
* */
db.runCommand({
mapReduce:'logs',
map:function(){
emit({sex:this.sex,name:this.name}, {sex:'sex'+ this.sex,age:3+this.age});
},
reduce:function(key,values){
var x = 0;
values.forEach(function (v) {x += v.age;});
return {key:key,x:x};
},
out:"students_result"
});
/*
{ "_id" : { "sex" : "女", "name" : 0 }, "value" : { "sex" : "sex女", "age" : 23 } }
{ "_id" : { "sex" : "女", "name" : 1 }, "value" : { "sex" : "sex女", "age" : 24 } }
{ "_id" : { "sex" : "女", "name" : 2 }, "value" : { "sex" : "sex女", "age" : 25 } }
{ "_id" : { "sex" : "女", "name" : 3 }, "value" : { "sex" : "sex女", "age" : 26 } }
{ "_id" : { "sex" : "女", "name" : 4 }, "value" : { "sex" : "sex女", "age" : 27 } }
{ "_id" : { "sex" : "女", "name" : 5 }, "value" : { "sex" : "sex女", "age" : 28 } }
{ "_id" : { "sex" : "女", "name" : 6 }, "value" : { "sex" : "sex女", "age" : 29 } }
{ "_id" : { "sex" : "女", "name" : 7 }, "value" : { "sex" : "sex女", "age" : 30 } }
{ "_id" : { "sex" : "女", "name" : 8 }, "value" : { "sex" : "sex女", "age" : 31 } }
{ "_id" : { "sex" : "女", "name" : 9 }, "value" : { "sex" : "sex女", "age" : 32 } }
*/
/*
* key:是emit的第一个值,this.sex
* values: 是emit的第二个组成的数组
* */
db.runCommand({
mapReduce:'logs',
map:function(){
emit(this.sex, {sex:'sex'+ this.sex,age:3+this.age});
},
reduce:function(key,values){
var x = 0;
values.forEach(function (v) {x += v.age;});
return {key:key,x:x};
},
out:"students_result"
});
//{ "_id" : "女", "value" : { "key" : "女", "x" : 275 } }
-
mongoDB(3) mapReduce的更多相关文章
- MongoDB 的 MapReduce 大数据统计统计挖掘
MongoDB虽然不像我们常用的mysql,sqlserver,oracle等关系型数据库有group by函数那样方便分组,但是MongoDB要实现分组也有3个办法: * Mongodb三种分组方式 ...
- MongoDb 用 mapreduce 统计留存率
MongoDb 用 mapreduce 统计留存率(金庆的专栏)留存的定义采用的是新增账号第X日:某日新增的账号中,在新增日后第X日有登录行为记为留存 输出如下:(类同友盟的留存率显示)留存用户注册时 ...
- mongoDB实现MapReduce
一.MongoDB Map Reduce Map-Reduce是一种计算模型,简单的说就是将大批量的工作(数据)分解(MAP)执行,然后再将结果合并成最终结果(REDUCE).MongoDB提供的Ma ...
- MongoDB:Map-Reduce
Map-reduce是一个考虑大型数据得到实用聚集结果的数据处理程式(paradigm).针对map-reduce操作,MongoDB提供来mapreduce命令. 考虑以下的map-reduce操作 ...
- MongoDB中mapReduce的使用
MongoDB中mapReduce的使用 制作人:全心全意 mapReduce的功能和group by的功能类似,但比group by处理的数据量更大 使用示例: var map = function ...
- mongodb 聚合(Map-Reduce)
介绍 Map-reduce 是一种数据处理范式,用于将大量数据压缩为有用的聚合结果.对于 map-reduce 操作,MongoDB 提供MapReduce数据库命令. MongoDB中的MapRed ...
- 在MongoDB的MapReduce上踩过的坑
太久没动这里,目前人生处于一个新的开始.这次博客的内容很久前就想更新上来,但是一直没找到合适的时间点(哈哈,其实就是懒),主要内容集中在使用Mongodb时的一些隐蔽的MapReduce问题: 1.R ...
- MongoDB进行MapReduce的数据类型
有很长一段时间没更新博客了,因为最近都比较忙,今天算是有点空闲吧.本文主要是介绍MapReduce在MongoDB上的使用,它与sql的分组.聚集类似,也是先map分组,再用reduce统计,最后还可 ...
- MongoDB下Map-Reduce使用简单翻译及示例
目录 Map-Reduce JavaScript 函数 Map-Reduce 行为 一个简单的测试 原文地址https://docs.mongodb.com/manual/core/map-reduc ...
随机推荐
- html5 摇一摇事件监听
先来看下html5的这几个特性: 1.deviceOrientation:方向传感器数据的事件,通过监听该事件可以获取手机静态状态下的方向数据: 2.deviceMotion: 运动传感器数据事件,通 ...
- Codeforces Round #245 (Div. 2) A - Points and Segments (easy)
水到家了 #include <iostream> #include <vector> #include <algorithm> using namespace st ...
- Codeforces Round #203 (Div. 2)
非常幸运..第三题,有个地方没想清楚,枚举一下就行了..x to n,这个x没考虑好,跪了...傻傻的lock了代码,通过hack进了DIV1,5-2 . 第一次进入DIV1,记录一下. 不知不觉,已 ...
- 【BZOJ2190】【SDOI2008】仪仗队
Description 作为体育委员,C君负责这次运动会仪仗队的训练.仪仗队是由学生组成的N * N的方阵,为了保证队伍在行进中整齐划一,C君会跟在仪仗队的左后方,根据其视线所及的学生人数来判断队伍是 ...
- tornado 学习笔记1 引言
从事软件开发这行业也快5年啦,其实从事的工作也不完全是软件开发,软件开发只是我工作中的一部分.其中包括课题研究.信息化方案设计.软件开发.信息系统监理.项目管理等工作,比较杂乱.开发的软件比较多,但是 ...
- CF #371 (Div. 2) C、map标记
1.CF #371 (Div. 2) C. Sonya and Queries map应用,也可用trie 2.总结:一开始直接用数组遍历,果断T了一发 题意:t个数,奇变1,偶变0,然后与问的 ...
- 在Javascript中监听flash事件(转)
在Javascript中监听flash事件,其实有两种做法: 1.在特定的环境下(例如专门制作的flash),大家约定一个全局函数,然后在flash的事件中用ExternalInterface.cal ...
- GridView合并表头、多重表头(转)
protected void GridView1_RowCreated(object sender, GridViewRowEventArgs e) { switch (e.Row.RowType) ...
- Node.js 手册查询-1-核心模块方法
Node.js 学习手册 标签(空格分隔): node.js 模块 核心模块 核心模块是被编译成二进制代码,引用的时候只需require表示符即可 os 系统基本信息 os模块可提供操作系统的一些基本 ...
- 分模块创建maven项目(二)
1.新建Parent项目,MavenProject 2.新建子模块项目,MavenProject 右击项目名 --> NEW --> other 结果,在parent上运行会打出两个包,一 ...