博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
MongoDB实战(4)MapReduce
阅读量:6835 次
发布时间:2019-06-26

本文共 1754 字,大约阅读时间需要 5 分钟。

在 MongoDB 上使用 Map/Reduce进行并行"统计"很容易。

使用 MapReduce 要实现两个函数 Map 函数和 Reduce 函数,Map 函数调用 emit(key, value),
遍历 collection 中所有的记录, 将key 与 value 传递给 Reduce 函数进行处理。
Map函数和Reduce函数可以使用 JavaScript 来实现,可以通过 db.runCommand 或 mapReduce 命令来执行一个MapReduce 的操作:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
db.runCommand(
{
    
mapReduce: <collection>,
    
map: <
function
>,
    
reduce: <
function
>,
    
out: <output>,
    
query: <document>,
    
sort
: <document>,
    
limit: <number>,
    
finalize: <
function
>,
    
scope: <document>,
    
jsMode: <boolean>,
    
verbose: <boolean>
})

参数说明:

mapreduce: 要操作的目标集合。

map: 映射函数 (生成键值对序列,作为 reduce 函数参数)。

reduce: 统计函数。

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

query: 目标记录过滤

sort: 目标记录排序。

limit: 限制目标记录数量。

finalize: 最终处理函数 (对 reduce 返回结果进行最终整理后存入结果集合)

scope: 向 map、reduce、finalize 导入外部变量。

jsMode: 是否转换Bson格式在map和reduce执行间

verbose: 显示详细的时间统计信息。

下面我们来搞一个例子吧:

准备一些数据:

接下来我们演示如何统计各个班的学生数量

Map:

Map 函数必须调用 emit(key, value) 返回键值对,使用 this 访问当前待处理的 Document。

1
2
3
m = 
function
(){
    
emit(this.classid,1);
}

value 可以使用 JSON Object 传递 (支持多个属性值)。

例如:emit(this.classid, {count:1})

Reduce:

Reduce 函数接收的参数类似 Group 效果,将 Map 返回的键值序列组合成 { key, [value1,

value2, value3, value...] } 传递给 reduce。

1
2
3
4
5
r = 
function
(key,values){
    
var x = 0;
    
values.forEach(
function
(
v
){x += 
v
});
    
return 
x;
}

Reduce 函数对这些 values 进行 "统计" 操作,返回结果可以使用 JSON Object。

Result:

mapReduce() 将结果存储在 "students_res" 表中。

Finalize:

利用 finalize() 我们可以对 reduce() 的结果做进一步处理。

1
2
3
f = 
function
(key,value){
    
return 
{classid:key,count:value}
}

我们再重新计算一次,看看结果:

Options:

我们还可以添加更多的控制细节。

1
2
3
4
5
6
7
8
db.runCommand({
    
mapreduce:
"stu"
,
    
map:m,
    
reduce:r,
    
out:
"stu_res"
,
    
finalize:f,
    
query:{age:{$gt:10}}
});

可以看到先进行了过滤,只取 age>10 的数据,然后再进行统计,所以就没有 age=9 的数

据了。

本文转自shayang8851CTO博客,原文链接:http://blog.51cto.com/janephp/1323812,如需转载请自行联系原作者

你可能感兴趣的文章
spring 整合websoket(整理)
查看>>
Linux 之alias 命令别名
查看>>
windows-台式机添加硬盘后如何加载、格式化新的分区
查看>>
Jupyter on Kubernetes机器学习-MLflow
查看>>
iframe 父页面与子页面之间的方法的相互调用
查看>>
关于windows的进程处理(七)
查看>>
Commonly Hacked Ports
查看>>
一段话系列-QPS、TPS、PV是很么如何计算
查看>>
java关键字和保留字整合(不定期补充) 转自小码哥
查看>>
Log4J日志配置详解
查看>>
Exchange日常管理之二十二:配置保留策略
查看>>
数据库原理 - 序列5 - 事务是如何实现的? - Undo Log解析
查看>>
【笔记】与Android酱的第一周
查看>>
最先进数据中心都建在哪?
查看>>
一个jsp内嵌一个jsp
查看>>
将用户添加至sudoers列表
查看>>
MySQL用户管理、常用sql语句、数据库备份
查看>>
Redis持久化实践及数据恢复
查看>>
分享一个java对xml,excel,jdbc.properties,读写文件,读写图片等实现(1)
查看>>
ApacheBench-web性能测试
查看>>