`

MongoDB的MapReduce使用

 
阅读更多

参考文章

 

 

http://www.mongodb.org/display/DOCS/MapReduce

http://www.rainsts.net/article.asp?id=1044

https://github.com/mongodb/mongo-java-driver/commit/fa003adc5db8a6c4efe0279c74973af15d99e6ed#diff-2

 

 

MapReduce是一个编程模型,封装了并行计算、容错、数据分布、负载均衡等细节问题。

输入是一个key-value对的集合,中间输出也是key-value对的集合,用户使用两个函数:Map和Reduce。

 

在使用MongoDb的mapreduce功能时,我找Java代码找半天,结果练了半天的Javascript代码。

MongoDb是通过解析“Javascript”代码来计算的。所有我们先用Javascript代码调通,再使用Java代码拼接使用这个MapReduce功能。

 

 

db.runCommand(
{
    mapreduce : <collection>,
    map : <mapfunction>,
    reduce : <reducefunction>
    [, query : <query filter object>]
    [, sort : <sort the query.  useful   optimization>] for
    [, limit : <number of objects to   from collection>] return
    [, out : <output-collection name>]
    [, keeptemp: < | >] true false
    [, finalize : <finalizefunction>]
    [, scope : <object where fields go into javascript global scope >]
    [, verbose :  ] true
});

 

 

 

参数说明:

 

  •  mapreduce: 要操作的目标集合。
  •  map: 映射函数 (生成键值对序列,作为 reduce 函数参数)。
  •  reduce: 统计函数。
  •  query: 目标记录过滤。
  •  sort: 目标记录排序。
  •  limit: 限制目标记录数量。
  •  out: 统计结果存放集合 (不指定则使用临时集合,在客户端断开后自动删除)。
  •  keeptemp: 是否保留临时集合。
  •  finalize: 最终处理函数 (对 reduce 返回结果进行最终整理后存入结果集合)。
  •  scope: 向 map、reduce、finalize 导入外部变量。
  •  verbose: 显示详细的时间统计信息

 

 

 

先看看我们的文档结果


 

 

 

 

我使用上一篇文章插入数据 http://xiaofancn.iteye.com/blog/1163200

 

讲讲我们要实现的功能,就是按照名字name统计记录个数。

 

 

 

D:\Program Files\mongodb>bin\mongo
MongoDB shell version: 2.0.0
connecting to: test
> use test;
switched to db test
> map = function() {
... emit(this.name, {count:1});
... };
function () {
    emit(this.name, {count:1});
}
> reduce = function(key, values) {
... var total = 0;
... var index =0;
... for(var i=0;i<values.length;i++){
...  total += values[i].count;
...  index = i;
... }
... return {count:total};
... };
function (key, values) {
    var total = 0;
    var index = 0;
    for (var i = 0; i < values.length; i++) {
        total += values[i].count;
        index = i;
    }
    return {count:total};
}
> db.person.mapReduce(map, reduce, {out : "resultCollection"});
{
        "result" : "resultCollection",
        "timeMillis" : 112,
        "counts" : {
                "input" : 10,
                "emit" : 10,
                "reduce" : 2,
                "output" : 2
        },
        "ok" : 1,
}
> db.resultCollection.find();
{ "_id" : "xiaofancn", "value" : { "count" : 3 } }
{ "_id" : "小樊", "value" : { "count" : 7 } }
 

 

map = function() { 
	emit(this.name, {count:1});
};

     此函数是形成下面的key-values结构的,emit就是指定key和value的,也是结果的数据结构。

 

xiaofancn [{count:1},{count:1},{count:1}]

 

     由于name字段为xiaofancn的person有三个,所以形成三个{count:1}数组。

 

 

 

reduce = function(key, values) {
	var total = 0;
	for(var i=0;i<values.length;i++){
		 total += values[i].count;
	}
	return {count:total};
};

reduce函数中参数key和map函数的emit指定的key(this.name)是同一个key(name),values就是map函数形成的values( [{count:1},{count:1},{count:1}])

 

经过reduce函数处理就形成了key和一个最终的 {count:3}数据结构。定义好的函数,需要MongoDB执行

 

 

db.person.mapReduce(map, reduce, {out : "resultCollection"});
db.resultCollection.find();
 

  db代表当前的数据库,person当前的文档,mapReduce调用函数,out:是指定输出的文档名称。

 


 

 

 

好了,会使用Javascript,使用Java就是拼接我们的Javascript代码了。

 

 

public void MapReduce() {

		DBCollection personColl = mongoOperations.getCollection(mongoOperations
				.getCollectionName(Person.class));
		String map = "function() { emit(this.name, {count:1});}";
		
		String reduce = "function(key, values) {";
		reduce=reduce+"var total = 0;";
		reduce=reduce+"for(var i=0;i<values.length;i++){total += values[i].count;}";
		reduce=reduce+"return {count:total};}";
		
		String result = "resultCollection";
		
		MapReduceOutput mapReduceOutput = personColl.mapReduce(map,
				reduce.toString(), result, null);
		DBCollection resultColl = mapReduceOutput.getOutputCollection();
		DBCursor cursor= resultColl.find();
		while (cursor.hasNext()) {
			System.out.println(cursor.next());
		}
	}
 

 

 

  • 大小: 95.2 KB
  • 大小: 79.1 KB
分享到:
评论
1 楼 violetluna 2011-12-31  
不过,明白了

相关推荐

    MongoDB MapReduce分享.ppt

    在这个“MongoDB MapReduce 分享”中,我们将深入探讨 MapReduce 在 MongoDB 中的应用及其核心概念。 MapReduce 包含两个主要函数:Map 和 Reduce。Map 阶段负责将输入数据分解成小块,然后对每一块应用一个函数,...

    mongodb mapreduce 实例

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

    MongoDB中MapReduce的使用方法详解

    MongoDB的MapReduce是一种强大的工具,用于处理和分析大量数据,...然而,对于简单聚合操作,通常建议使用MongoDB的内置聚合框架,因为它通常更高效。理解MapReduce的工作原理和最佳实践对于优化大数据处理至关重要。

    MongoDB中的MapReduce简介

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

    MongoDB的MapReduce.pdf

    MongoDB的MapReduce是一种在大型数据...然而,需要注意的是,MapReduce可能不适合实时查询,因为它通常涉及磁盘I/O和内存消耗,对于性能要求高的场景,可以考虑使用其他数据处理方法,如聚合框架或MongoDB的TTL索引等。

    MongoDB学习笔记之MapReduce使用示例

    MongoDB的MapReduce是一个强大的工具,它允许开发者处理和聚合大量数据。MapReduce基于一种分布式计算模型,将大规模数据处理任务分解为两步:Map(映射)和Reduce(归约)。在这个过程中,MongoDB首先应用Map函数...

    计算机后端-PHP视频教程. mongodb10 MapReduce 统计栏目下的商品.wmv

    计算机后端-PHP视频教程. mongodb10 MapReduce 统计栏目下的商品.wmv

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

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

    MongoDB中MapReduce编程模型使用实例

    通过单词计数的实例,我们可以理解MongoDB中MapReduce编程模型的使用方式和特点。 单词计数示例是MapReduce的一个典型应用,其基本思想是统计文本中每个单词出现的次数。在MongoDB中,首先需要准备好待处理的文档...

    计算机后端-PHP视频教程. mongodb09 MapReduce 概念.wmv

    计算机后端-PHP视频教程. mongodb08 导出导入.wmv

    mongodb使用文档集

    以下是对MongoDB的详细介绍,涵盖安装配置、命令使用及基本操作。 一、MongoDB安装配置 MongoDB的安装过程相对简单,支持Windows、Linux和macOS等多种操作系统。在Windows上,可以通过下载安装包进行安装;在Linux...

    MapReduceMongoDB:在 MongoDB 中使用 Map reduce

    标题:在 MongoDB 中使用 Map Reduce 检查波兰语和英语句子中的字母分布 动机 我们越来越多地听到各种网站遭到攻击以及密码非常薄弱的​​管理员的不负责任。 如何创建一个强密码:有一种观点认为你应该造一个句子,...

    MongoDB in action 源码

    8. MapReduce:虽然现代MongoDB推荐使用聚合框架,但MapReduce仍然是一种处理大数据的手段,用于批量数据处理和分析。 9. 安全性:MongoDB支持用户认证、角色权限控制和加密通信,保障数据安全。 10. 应用集成:...

    NoSQL主流数据库-MongoDB.pptx

    * 支持 MapReduce:MongoDB 支持 MapReduce 操作,可以对大量数据进行分布式处理。 MongoDB 的缺点包括: * 不支持事务:MongoDB 不支持事务操作,可能会导致数据不一致的问题。 * 不支持JOIN操作:MongoDB 不支持...

Global site tag (gtag.js) - Google Analytics