MongoDB中MapReduce编程模型使用实例
注:作者使用的MongoDB为2.4.7版本。
单词计数示例:
插入用于单词计数的数据:
db.data.insert({sentence:"Considerthefollowingmap-reduceoperationsonacollectionordersthatcontainsdocumentsofthefollowingprototype"})
db.data.insert({sentence:"IgetthefollowingerrorwhenIfollowthecodefoundinthislink"})
图个简洁,数据中没有包含标点符号。在mongoshell写入以下内容:
varmap=function(){
split_result=this.sentence.split("");
for(variinsplit_result){
varword=split_result[i].replace(/(^\s*)|(\s*$)/g,"").toLowerCase();//去除了单词两边可能的空格,并将单词转换为小写
if(word.length!=0){
emit(word,1);
}
}
}
varreduce=function(key,values){
returnArray.sum(values);
}
db.data.mapReduce(
map,
reduce,
{out:{inline:1}}
)
db.data.mapReduce的第一和第二个参数分别指定map和reduce,map的输入是集合中的每个文档,通过emit()生成键值对;而reduce则处理键的多个值。
mapReduce的第三个参数指明在内存中进行mapreduce并返回结果,运行结果如下:
{
"results":[
{
"_id":"a",
"value":1
},
{
"_id":"code",
"value":1
},
{
"_id":"collection",
"value":1
},
{
"_id":"consider",
"value":1
},
{
"_id":"contains",
"value":1
},
{
"_id":"documents",
"value":1
},
{
"_id":"error",
"value":1
},
{
"_id":"follow",
"value":1
},
{
"_id":"following",
"value":3
},
{
"_id":"found",
"value":1
},
{
"_id":"get",
"value":1
},
{
"_id":"i",
"value":2
},
{
"_id":"in",
"value":1
},
{
"_id":"link",
"value":1
},
{
"_id":"map-reduce",
"value":1
},
{
"_id":"of",
"value":1
},
{
"_id":"on",
"value":1
},
{
"_id":"operations",
"value":1
},
{
"_id":"orders",
"value":1
},
{
"_id":"prototype",
"value":1
},
{
"_id":"that",
"value":1
},
{
"_id":"the",
"value":4
},
{
"_id":"this",
"value":1
},
{
"_id":"when",
"value":1
}
],
"timeMillis":1,
"counts":{
"input":2,
"emit":30,
"reduce":3,
"output":24
},
"ok":1,
}
results的值是MapReduce的处理结果,timeMillis指明花费的时间;counts中input指明了输入的文档数,emit指明了在map中调用emit的次数,reduce指明了reduce的次数(本例中如果单次次数为1则不需要reduce),output指明了输出的文档数目。
可以看到,键_id不再是自动生成,而是被reduce中的key取代。当然,也可以将结果输入到一个新的collection中,例如:
之后查看mr_result集合中的内容即可:
也可以使用db.runCommand执行mapreduce任务,这种方法为开发者提供了更多的选项,具体请见资料[1]。资料[2][3][4]提供了关于mapreduce更全面的内容。资料[5]给出了优化mapreduce任务的方法,资料[6]是资料[5]的一篇中文翻译。
应该注意的是,资料[5]中提到使用ScopedThread()创建线程,笔者在GUI工具Robomongo的shell中运行newScopedThread()时候报错:ReferenceError:ScopedThreadisnotdefined(shell):1
不过在mongoshell中可以正常运行:
>newScopedThread()
SatMar2221:32:36.062Error:needatleastoneargumentatsrc/mongo/shell/utils.js:101
如果使用其他编程语言管理MongoDB,要用到线程时,应该使用该编程语言内置的线程。
关于mongodb实现的mapreduce,个人觉得如果支持多个MR任务平滑过渡就更好了。
相关文章
- Redis 与 MongoDB 集成(一)
- 一文告诉你 mongodb清除连接和日志的正确方法
- MongoDB分片键的选择和案例实例详解
- PHP MongoDB GridFS 存储文件的方法详解
- Centos下升级Python及Mongodb驱动安装问题
- Mongodb多实例管理:最佳实践(mongodb多个实例)
- 终极 MongoDB 面试题集锦(mongodb面试题)
- MongoDB启动过程:快速上手(mongodb的启动)
- MongoDB驱动的图像存储功能(mongodb存储图像)
- MongoDB统计计数:一种有效的数据组织方式(mongodb计数)
- 推荐提升工作效率:MongoDB 代码推荐(mongodb代码)
- MongoDB实践:从零开始的数据管理之旅(mongodb实践)
- MongoDB如何完美恢复数据库(mongodb恢复数据库)
- MongoDB官网:免费下载最新版本(mongodb官网下载)
- MongoDB索引助力数据查询与管理(mongodb建索引)
- MongoDB开发游戏之路(mongodb开发游戏)
- MongoDB:管理数据库的基础技能(mongodb数据库管理)
- MongoDB实战:从入门到精通(mongodb实战)
- MongoDB 认证保障数据安全(mongodb认证)
- 深入探索MongoDB:数据库文件解读(mongodb数据库文件)
- 使用MongoDB客户端连接数据库,轻松管理数据(mongodb客户端连接)
- 型转换使用MongoDB实现快速数据类型转换(mongodb类)
- MongoDB实例:简单易学利用起来(mongodb例子)
- 易学实用!详解Linux下Mongodb的安装方法(linux安装mongodb)
- Exploring the Diverse Storage Formats of MongoDB for Maximum Efficiency(mongodb存储格式)
- 实现高可用性:使用MongoDB的热备功能保障数据安全(mongodb热备)
- MongoDB:开放源码的编程之旅(mongodb开源项目)
- 利用MongoDB管理文件系统存储(mongodb文件系统)
- mongoDB分页的两种方法(图例)