`
gong1208
  • 浏览: 559059 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

来,我给你们看一段神奇的mongodb的mapreduce操作

阅读更多

      来,我给你们看一段神奇的mongodbmapreduce操作!

 

 

首先我们执行一段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"});
}

 没有问题,随后我们来使用mongodbmapreduce来进行一个统计,统计同一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环境我稍后回来继续做~

1
0
分享到:
评论
6 楼 晨必须的 2014-07-26  
记录数大于1000,reduce就要分开多次处理了

解决办法
1.
return {count: count }; 

改 为

return {value: count }; 


2.
map
  emit(this.ip, 1); 

reduce
   return Array.sum(values)


5 楼 gong1208 2013-08-13  
rmn190 写道
请问下,  你这个问题最终解决了没? 剧透下呗?

解决了,你看我另一篇文章就明白啦
4 楼 rmn190 2013-07-08  
请问下,  你这个问题最终解决了没? 剧透下呗?
3 楼 gong1208 2013-03-27  
linux中的实验也做了,结果跟在windows一样坑爹,鉴定完毕
2 楼 andilyliao 2013-03-19  
mongodb看来真得慎用,哈哈,不过做并行运算我还是力挺hadoop。
1 楼 laibin1320 2013-03-17  
哥们,我比较关心的是,你们设什么需求的系统呀,为什么用mongodb,而不用传统的rdbms呢?

相关推荐

    MongoDB MapReduce分享.ppt

    MapReduce 是 MongoDB 提供的一种分布式计算框架,用于处理和聚合大数据。在这个“MongoDB MapReduce 分享”中,我们将深入探讨 MapReduce 在 MongoDB 中的应用及其核心概念。 MapReduce 包含两个主要函数:Map 和 ...

    mongodb mapreduce 实例

    MongoDB的MapReduce是一个强大的工具,它允许用户在数据库中执行复杂的聚合操作,尤其是处理大数据集时。在这个实例中,我们将探讨如何利用MapReduce来统计订单数据,这在电子商务平台如“CShop”中是非常常见的需求...

    MongoDB中MapReduce的使用方法详解

    在MongoDB中,MapReduce通过两个主要函数——map和reduce——以及可选的finalize函数来实现这一过程。 **1. Map函数** Map函数是MapReduce的第一步,它的任务是遍历输入文档(即集合中的每个记录),并为每个文档...

    MongoDB中的MapReduce简介

    MongoDB的MapReduce功能是基于分布式计算模型的一种数据处理方式,它允许用户在数据库中进行大规模数据处理。MapReduce的核心思想是将复杂的数据处理任务分解为两个主要阶段:Map阶段和Reduce阶段。 Map阶段是数据...

    MongoDB的MapReduce.pdf

    总的来说,MongoDB的MapReduce提供了一种处理大量数据的灵活方式,特别适合于需要聚合和分析数据的场景。通过结合Map的并行处理能力和Reduce的聚合功能,开发人员可以高效地处理复杂的数据分析任务。然而,需要注意...

    MongoDB与Hadoop MapReduce的海量非结构化数据处理方案.pdf

    MongoDB与Hadoop MapReduce的海量非结构化数据处理方案 本文旨在探索基于MongoDB与Hadoop MapReduce的海量非结构化数据处理方案,旨在解决大数据时代下的数据处理难题。该方案通过MongoDB Cluster、MongoDB-...

    mapreduce mapreduce mapreduce

    MapReduce是一种分布式计算模型,由Google开发,用于处理和生成大量数据。这个模型主要由两个主要阶段组成:Map(映射)和Reduce(规约)。MapReduce的核心思想是将复杂的大规模数据处理任务分解成一系列可并行执行...

    MapReduce操作实例-数据去重.pdf

    在这个实例中,我们看到的是一个基于MapReduce的数据去重操作,这个操作在大数据处理中非常常见,尤其是当处理的数据源包含重复记录时。下面将详细解释每个部分的作用。 1. **Mapper类**: 在`DedupMapper`类中,...

    Java操作Hadoop Mapreduce基本实践源码

    本文将深入探讨如何使用Java编程语言来操作Hadoop MapReduce进行基本实践,通过源码分析来理解其核心工作原理和编程模型。 MapReduce的核心思想是将大规模数据集分解成小块,然后在分布式集群上并行处理这些小块,...

    实验项目 MapReduce 编程

    实验项目“MapReduce 编程”旨在让学生深入理解并熟练运用MapReduce编程模型,这是大...总的来说,这个实验项目全面地覆盖了MapReduce的基础知识和实践操作,对于提升学生的Hadoop技能和大数据处理能力有着显著效果。

    大数据Mapreduce(1)编程实现文件合并和去重操作.docx

    大数据Mapreduce编程实现文件合并和去重操作 大数据处理技术中的MapReduce编程是处理大量数据的一种常用方法。本实验报告将介绍如何使用MapReduce编程实现文件合并和去重操作,并对输入文件进行排序和数据挖掘。 ...

    大数据mapreduce案例

    MapReduce是大数据处理领域中的一个核心框架,由Google在2004年提出,主要用于海量数据的分布式计算。它的设计理念简单而强大,将复杂的大规模数据处理任务分解为两个主要阶段:Map(映射)和Reduce(化简)。在这个...

    华为MapReduce服务组件操作指南.pdf

    华为MapReduce服务组件操作指南是一份详细介绍如何使用华为MapReduce服务组件的文档,内容涵盖了Alluxio的配置与操作、CarbonData在不同版本MRS中的使用方法、操作指导、性能调优、访问控制、语法参考、故障处理以及...

    MapReduce发明人关于MapReduce的介绍

    总之,MapReduce不仅仅是一项技术革新,它代表了一种思维方式的转变,即将复杂的大数据处理问题分解为可管理的小任务,再通过并行计算来加速整个过程。这一理念在当今的大数据时代依然具有重要意义,启发了后续众多...

Global site tag (gtag.js) - Google Analytics