来,我给你们看一段神奇的mongodb的mapreduce操作!
首先我们执行一段js,用来往mongodb数据库里插入几条记录:
//insert.js
for(var i=0;i<5;i++){
db.RegistRecord.save({"ip":"11.11.11.11","account":"ongyong"});
}
for(var i=0;i<2;i++){
db.RegistRecord.save({"ip":"11.11.11.22","account":"ongyong22"});
}
for(var i=0;i<1;i++){
db.RegistRecord.save({"ip":"11.11.11.33","account":"ongyong33"});
}
没有问题,随后我们来使用mongodb的mapreduce来进行一个统计,统计同一ip在记录里出现的次数,很简单的mapreduce入门例子,写法如下,不多解释。
//regmp.js
printjson("job start");
var map = function() {
emit(this.ip, {value: 1});
}
var reduce = function(key, values) {
var count = 0;
values.forEach(function(v) {
count += v['value'];
});
return {count: count };
}
var res = db.runCommand({mapreduce:"RegistRecord",map:map, reduce:reduce, out:"log_results"});
printjson("job end")
然后我们执行这个js脚本。
我们看结果:
/* 0 */
{
"_id" : "11.11.11.11",
"value" : {
"count" : 5.0
}
}
/* 1 */
{
"_id" : "11.11.11.22",
"value" : {
"count" : 2.0
}
}
/* 2 */
{
"_id" : "11.11.11.33",
"value" : {
"value" : 1.0
}
}
OK,运算结果正确,各ip分别出现了5次,2次,1次。
OK,到这里,如果你认为我就是要为了演示这个东西,那我肯定是来找喷的,哥们儿,这特么一点也不神奇。神奇的事情在下面,我们继续看:
当我们把记录数增加到某一个量级,(如2000)
//insert.js
for(var i=0;i<2000;i++){
db.RegistRecord.save({"ip":"11.11.11.11","account":"ongyong"});
}
for(var i=0;i<2;i++){
db.RegistRecord.save({"ip":"11.11.11.22","account":"ongyong22"});
}
for(var i=0;i<1;i++){
db.RegistRecord.save({"ip":"11.11.11.33","account":"ongyong33"});
}
然后我们再次执行regmp.js这段代码运行mapreduce,注意,绝对没有任何改动,这时,神奇的事情出现了,看结果:
/* 0 */
{
"_id" : "11.11.11.11",
"value" : {
"count" : NaN
}
}
/* 1 */
{
"_id" : "11.11.11.22",
"value" : {
"count" : 2.0
}
}
/* 2 */
{
"_id" : "11.11.11.33",
"value" : {
"value" : 1.0
}
}
11.11.11.11这个ip的结果出现了一个非数值型字符串!!!而其余两个正确。神奇啊!不明白啊!困惑啊!!
然而,我得找原因啊,我想知道,到底在经过map函数后,reduce函数接受到的values的格式是怎样的,我稍微改了下reduce函数,我不进行任何操作,直接把value作为结果保存。
改动后的Reduce函数如下:
var reduce = function(key, values) {
return {count: values };
}
首先,看记录数各为:5,2,1时,经过map函数处理,然后传给reduce函数的参数格式如下:
/* 0 */
{
"_id" : "11.11.11.11",
"value" : {
"count" : [{
"value" : 1.0
}, {
"value" : 1.0
}, {
"value" : 1.0
}, {
"value" : 1.0
}, {
"value" : 1.0
}]
}
}
/* 1 */
{
"_id" : "11.11.11.22",
"value" : {
"count" : [{
"value" : 1.0
}, {
"value" : 1.0
}]
}
}
/* 2 */
{
"_id" : "11.11.11.33",
"value" : {
"value" : 1.0
}
}
没有问题!传到reduce函数中的value是一个固定格式的json串。我们可以对count中的各元素进行数值运算。
然后,我们看记录数为2000的,结果:
/* 0 */
{
"_id" : "11.11.11.22",
"value" : {
"count" : [{
"value" : 1.0
}, {
"value" : 1.0
}]
}
}
/* 1 */
{
"_id" : "11.11.11.33",
"value" : {
"value" : 1.0
}
}
/* 2 */
{
"_id" : "11.11.11.11",
"value" : {
"count" : [{
"count" : [{
"value" : 1.0
}, {
"value" : 1.0
}, {
"value" : 1.0
}, {
。。。。此处省略后面记录
看!!!最后这条记录!瞎了吧!!!传过来的values值的结构都改变了!!!无缘无故的嵌套了几层count,再用 count += v['value']当然没法进行数值运行啦!!!坑爹啊!!!为什么???
注:
Mongodb版本 2.0.1 ,32bit
环境:windowxp 32bit
(少废话,我生产环境当然是用的linux,我这不是做实验么)
我要吃晚饭了先,linux环境我稍后回来继续做~
相关推荐
mongodb mapreduce 实例,该例子主要用来做订单统计的。具体问题请到博客提问。
MongoDB MapReduce MapReduce是一种计算模型,简单的说就是将大批量的工作(数据)分解(MAP)执行,然后再将结果合并成最终结果(REDUCE)。这样做的好处是可以在任务被分解后,可以通过大量机器进行并行计算,减少...
NULL 博文链接:https://superhuo.iteye.com/blog/1193485
MapReduce应该算是MongoDB操作中比较复杂的了,下面这篇文章主要给大家介绍了关于MongoDB中MapReduce使用的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面随着小编来一起看看吧。
MongoDB的MapReduce.pdf 学习资料 复习资料 教学资源
Mongodb是针对大数据量环境下诞生的用于保存大数据量的非关系型数据库,针对大量的数据。接下来通过本文给大家介绍Mongodb中MapReduce实现数据聚合方法详解,感兴趣的朋友一起学习吧
1.分篇章进行学习,内容控制30分钟内 2.1个月疗程,不要放弃治疗哦 3.图文并茂,有问题请发到邮箱
mapreduce mapreduce mapreduce mapreduce mapreduce mapreduce mapreduce mapreduce mapreduce mapreduce mapreduce mapreduce mapreduce mapreduce mapreduce mapreduce mapreduce mapreduce mapreduce mapreduce ...
一个简单的Mongodb mapreduce的例子
mongo group by mapreduce操作指导!
MapReduce 是 Google 在 2004 年发布的一个软件框架,用于支持大规模数据的分布式计算。 MongoDB 是一个开源的面向文档的 NoSQL 数据库系统,使用 C++ 编写。
MapReduce操作实例-数据去重.pdf 学习资料 复习资料 教学资源
Java操作Hadoop Mapreduce基本实践源码.
MapReduce操作实例-倒排索引.pdf 学习资料 复习资料 教学资源
MapReduceExample 下建立新包 com.xijing.mapreduce,模仿内置的 WordCount 示例,自己编写一个 WordCount 程序,最后打包成 JAR 形式并在 Hadoop 集群上运行该 MR-App,查看运行结果。 4 分别在自编 MapReduce 程序...
Mapreduce实验报告 前言和简介 MapReduce是Google提出的一种编程模型,在这个模型的支持下可以实现大规模并行化计 算。在Mapreduce框架下一个计算机群通过统一的任务调度将一个巨型任务分成许多部分 ,分别解决然后...
计算机后端-PHP视频教程. mongodb10 MapReduce 统计栏目下的商品.wmv
(一)编程实现文件合并和去重操作 对于两个输入文件,即文件 A 和文件 B,请编写 MapReduce 程序,对两个文件进行合并, 并剔除其中重复的内容,得到一个新的输出文件 C。下面是输入文件和输出文件的一个样例 供...