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

关于《来,我给你们看一段神奇的mongodb的mapreduce操作!》的解释

阅读更多

各位好,在阅读本文请务必先阅读上一篇文章《来,我给你们看一段神奇的mongodb的mapreduce操作!》,链接:http://gong1208.iteye.com/blog/1830576

因为此文是上一篇文章的解释。

 

我在上篇博客中指出的mongodb进行mapreduce时出现的奇怪的错误,其实是我个人的错误,原因在于mongodb进行mapreduce时,reduce函数有一段说明: 

 

Requirements for the reduce Function

The reduce function has the following prototype:

function(key, values) {

...

return result;

}

The reduce function exhibits the following behaviors:

  • The reduce function should not access the database, even to perform read operations.
  • The reduce function should not affect the outside system.
  • MongoDB will not call the reduce function for a key that has only a single value.
  • The reduce function can access the variables defined in the scope parameter.

Because it is possible to invoke the reduce function more than once for the same key, the following properties need to be true

  • he type of the return object must be identical to the type of the value emitted by the map function to ensure that the following operations is true:

·      reduce(key, [ C, reduce(key, [ A, B ]) ] ) == reduce( key, [ C, A, B ] )

  • the reduce function must be idempotent. Ensure that the following statement is true:

·      reduce( key, [ reduce(key, valuesArray) ] ) == reduce( key, valuesArray )

 

  • the order of the elements in the valuesArray should not affect the output of the reduce function, so that the following statement is true:

 

reduce( key, [ A, B ] ) == reduce( key, [ B, A ] )

参考地址: http://docs.mongodb.org/manual/reference/method/db.collection.mapReduce/#db.collection.mapReduce

 

这段话的意思是,reduce函数有可能在执行一个任务是可能会被调用多次,而不是我们理解的传统的方法中,一次任务只调用一次,所以,reduce函数必须是幂等的。简单来说,就是reduce函数中接收的value参数的形式,必须和reduce函数返回的结果value的形式一致。

仍然拿我上个例子说明:

起初我是这么写的:

 

2.	printjson("job start");  
3.	var map = function() {  
4.	  emit(this.ip, {value: 1});  
5.	}  
6.	  
7.	var reduce = function(key, values) {  
8.	  var count = 0;  
9.	  values.forEach(function(v) {  
10.	    count += v['value'];  
11.	  });  
12.	  return {count: count };  
13.	  
14.	}  
15.	  
16.	var res = db.runCommand({mapreduce:"RegistRecord",map:map, reduce:reduce, out:"log_results"});  
17.	printjson("job end")  

可以看出emit函数的第二个参数形式为:{value:number},所以reduce函数的values值的形式为:{value:number},所以,reduce函数的返回值形式也必须应当是{value:number},因为reduce函数会将自己的返回值再次作为下一次reduce的输入值使用。

改为如下就正确了:

 

var reduce = function(key, values) { 
var count = {value:0};  
values.forEach(function(v) {  
 count.value += v['value'];  
});  
return count;  
}  

 

ps:在此特别感谢mongodb社区的Kay.Kim<kay.kim@10gen.com>,我曾发了封邮件向mongodb社区请教此问题,没想到居然收到了社区的热心答复,并为我解答了此问题。

 

 

分享到:
评论
2 楼 guodage003 2014-12-06  
for(var i = 0; i<2000; i++){
db.test.insert({_id:i, city:"bj"});
}

以上是基础数据,city均为bj,然后我希望利用mapreduce将city为bj的条目id整合出来。

map=function(){emit(this.city, this._id)};
reduce = function(key,values){
  var ret= {id:[]};
  values.forEach(function(value){
    ret.id.push(value);
  });
  return ret;
}

然后输出的结构很混乱,里面各种嵌套。形如:
{ "_id" : "bj", "value" : { "id" : [ { "id" : [ { "id" : [ { "id" : [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11,......

我按照文章最后的意思,修改了value的形式
map=function(){emit(this.city, {id:this._id})};
reduce = function(key,values){
  var ret= {id:[]};
  values.forEach(function(value){
    ret.id.push(value.id);
  });
  return ret;
}
输出结果有发生改变,但仍然有各种嵌套:形如:
{ "_id" : "bj", "value" : { "id" : [ [ [ [ [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16.....

今天搜到您的帖子,特此请教,我哪里的理解有问题?
1 楼 IceWee 2014-08-21  
感谢分享!

相关推荐

    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.pdf

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

    MongoDB中的MapReduce简介

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

    MapReduce发明人关于MapReduce的介绍

    接下来的部分(原文未完全提供)可能会深入探讨MapReduce的基本编程模型,给出具体的应用案例,解释其内部架构,如数据分片、任务调度、容错机制等,并可能涉及MapReduce如何适应不同规模和类型的数据集,以及如何...

    大数据mapreduce案例

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

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

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

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

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

    mapreduce mapreduce mapreduce

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

    Java操作Hadoop Mapreduce基本实践源码

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

    实验项目 MapReduce 编程

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

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

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

    MapReduce基础.pdf

    ### MapReduce基础知识详解 #### 一、MapReduce概述 **MapReduce** 是一种编程模型,最初由Google提出并在Hadoop中实现,用于处理大规模数据集的分布式计算问题。该模型的核心思想是将复杂的大型计算任务分解成较...

Global site tag (gtag.js) - Google Analytics