各位好,在阅读本文请务必先阅读上一篇文章《来,我给你们看一段神奇的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 ] )
· 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社区请教此问题,没想到居然收到了社区的热心答复,并为我解答了此问题。
相关推荐
MapReduce 是 MongoDB 提供的一种分布式计算框架,用于处理和聚合大数据。在这个“MongoDB MapReduce 分享”中,我们将深入探讨 MapReduce 在 MongoDB 中的应用及其核心概念。 MapReduce 包含两个主要函数:Map 和 ...
MongoDB的MapReduce是一个强大的工具,它允许用户在数据库中执行复杂的聚合操作,尤其是处理大数据集时。在这个实例中,我们将探讨如何利用MapReduce来统计订单数据,这在电子商务平台如“CShop”中是非常常见的需求...
在MongoDB中,MapReduce通过两个主要函数——map和reduce——以及可选的finalize函数来实现这一过程。 **1. Map函数** Map函数是MapReduce的第一步,它的任务是遍历输入文档(即集合中的每个记录),并为每个文档...
总的来说,MongoDB的MapReduce提供了一种处理大量数据的灵活方式,特别适合于需要聚合和分析数据的场景。通过结合Map的并行处理能力和Reduce的聚合功能,开发人员可以高效地处理复杂的数据分析任务。然而,需要注意...
MongoDB的MapReduce功能是基于分布式计算模型的一种数据处理方式,它允许用户在数据库中进行大规模数据处理。MapReduce的核心思想是将复杂的数据处理任务分解为两个主要阶段:Map阶段和Reduce阶段。 Map阶段是数据...
接下来的部分(原文未完全提供)可能会深入探讨MapReduce的基本编程模型,给出具体的应用案例,解释其内部架构,如数据分片、任务调度、容错机制等,并可能涉及MapReduce如何适应不同规模和类型的数据集,以及如何...
MapReduce是大数据处理领域中的一个核心框架,由Google在2004年提出,主要用于海量数据的分布式计算。它的设计理念简单而强大,将复杂的大规模数据处理任务分解为两个主要阶段:Map(映射)和Reduce(化简)。在这个...
MongoDB与Hadoop MapReduce的海量非结构化数据处理方案 本文旨在探索基于MongoDB与Hadoop MapReduce的海量非结构化数据处理方案,旨在解决大数据时代下的数据处理难题。该方案通过MongoDB Cluster、MongoDB-...
在这个实例中,我们看到的是一个基于MapReduce的数据去重操作,这个操作在大数据处理中非常常见,尤其是当处理的数据源包含重复记录时。下面将详细解释每个部分的作用。 1. **Mapper类**: 在`DedupMapper`类中,...
MapReduce是一种分布式计算模型,由Google开发,用于处理和生成大量数据。这个模型主要由两个主要阶段组成:Map(映射)和Reduce(规约)。MapReduce的核心思想是将复杂的大规模数据处理任务分解成一系列可并行执行...
本文将深入探讨如何使用Java编程语言来操作Hadoop MapReduce进行基本实践,通过源码分析来理解其核心工作原理和编程模型。 MapReduce的核心思想是将大规模数据集分解成小块,然后在分布式集群上并行处理这些小块,...
实验项目“MapReduce 编程”旨在让学生深入理解并熟练运用MapReduce编程模型,这是大...总的来说,这个实验项目全面地覆盖了MapReduce的基础知识和实践操作,对于提升学生的Hadoop技能和大数据处理能力有着显著效果。
大数据Mapreduce编程实现文件合并和去重操作 大数据处理技术中的MapReduce编程是处理大量数据的一种常用方法。本实验报告将介绍如何使用MapReduce编程实现文件合并和去重操作,并对输入文件进行排序和数据挖掘。 ...
### MapReduce基础知识详解 #### 一、MapReduce概述 **MapReduce** 是一种编程模型,最初由Google提出并在Hadoop中实现,用于处理大规模数据集的分布式计算问题。该模型的核心思想是将复杂的大型计算任务分解成较...