MongoDB中MapReduce编程模型使用实例_MongoDB

注:作者使用的MongoDB为2.4.7版本。

单词计数示例:

插入用于单词计数的数据:

复制代码 代码如下:

db.data.insert({sentence:'Consider the following map-reduce operations on a collection orders that contains documents of the following prototype'})
db.data.insert({sentence:'I get the following error when I follow the code found in this link'})

图个简洁,数据中没有包含标点符号。 在mongo shell写入以下内容:

复制代码 代码如下:

var map = function() {
    split_result = this.sentence.split(" ");
    for (var i in split_result) {
        var word = split_result[i].replace(/(^\s*)|(\s*$)/g,"").toLowerCase(); //去除了单词两边可能的空格,并将单词转换为小写
        if (word.length != 0) {
            emit(word, 1);
        }
    }
}

var reduce = function(key, values) {
    return Array.sum(values);
}

db.data.mapReduce(
    map,
    reduce,
    {out:{inline:1}}
)

db.data.mapReduce的第一和第二个参数分别指定map和reduce,map的输入是集合中的每个文档,通过emit()生成键值对;而reduce则处理键的多个值。

mapReduce的第三个参数指明在内存中进行mapreduce并返回结果,运行结果如下:

复制代码 代码如下:

{
        "results" : [
                {
                        "_id" : "a",
                        "value" : 1
                },
                {
                        "_id" : "code",
                        "value" : 1
                },
                {
                        "_id" : "collection",
                        "value" : 1
                },
                {
                        "_id" : "consider",
                        "value" : 1
                },
                {
                        "_id" : "contains",
                        "value" : 1
                },
                {
                        "_id" : "documents",
                        "value" : 1
                },
                {
                        "_id" : "error",
                        "value" : 1
                },
                {
                        "_id" : "follow",
                        "value" : 1
                },
                {
                        "_id" : "following",
                        "value" : 3
                },
                {
                        "_id" : "found",
                        "value" : 1
                },
                {
                        "_id" : "get",
                        "value" : 1
                },
                {
                        "_id" : "i",
                        "value" : 2
                },
                {
                        "_id" : "in",
                        "value" : 1
                },
                {
                        "_id" : "link",
                        "value" : 1
                },
                {
                        "_id" : "map-reduce",
                        "value" : 1
                },
                {
                        "_id" : "of",
                        "value" : 1
                },
                {
                        "_id" : "on",
                        "value" : 1
                },
                {
                        "_id" : "operations",
                        "value" : 1
                },
                {
                        "_id" : "orders",
                        "value" : 1
                },
                {
                        "_id" : "prototype",
                        "value" : 1
                },
                {
                        "_id" : "that",
                        "value" : 1
                },
                {
                        "_id" : "the",
                        "value" : 4
                },
                {
                        "_id" : "this",
                        "value" : 1
                },
                {
                        "_id" : "when",
                        "value" : 1
                }
        ],
        "timeMillis" : 1,
        "counts" : {
                "input" : 2,
                "emit" : 30,
                "reduce" : 3,
                "output" : 24
        },
        "ok" : 1,
}

results的值是MapReduce的处理结果,timeMillis指明花费的时间;counts中input指明了输入的文档数,emit指明了在map中调用emit的次数,reduce指明了reduce的次数(本例中如果单次次数为1则不需要reduce),output指明了输出的文档数目。

可以看到,键_id不再是自动生成,而是被reduce中的key取代。当然,也可以将结果输入到一个新的collection中,例如:

复制代码 代码如下:

db.data.mapReduce( map, reduce, {out:"mr_result"} )

之后查看mr_result集合中的内容即可:

复制代码 代码如下:

db.mr_result.find()

也可以使用db.runCommand执行mapreduce任务,这种方法为开发者提供了更多的选项,具体请见资料[1]。资料[2][3][4]提供了关于mapreduce更全面的内容。资料[5]给出了优化mapreduce任务的方法,资料[6]是资料[5]的一篇中文翻译。

应该注意的是,资料[5]中提到使用ScopedThread()创建线程,笔者在GUI工具Robomongo的shell中运行 new ScopedThread()时候报错: ReferenceError: ScopedThread is not defined (shell):1

不过在mongo shell中可以正常运行:

复制代码 代码如下:

> new ScopedThread()
Sat Mar 22 21:32:36.062 Error: need at least one argument at src/mongo/shell/utils.js:101

如果使用其他编程语言管理MongoDB,要用到线程时,应该使用该编程语言内置的线程。

关于mongodb实现的mapreduce,个人觉得如果支持多个MR任务平滑过渡就更好了。

时间: 2024-08-01 14:00:15

MongoDB中MapReduce编程模型使用实例_MongoDB的相关文章

Mongodb中MapReduce实现数据聚合方法详解_MongoDB

Mongodb是针对大数据量环境下诞生的用于保存大数据量的非关系型数据库,针对大量的数据,如何进行统计操作至关重要,那么如何从Mongodb中统计一些数据呢? 在Mongodb中,给我们提供了三种用于数据聚合的方式: (1)简单的用户聚合函数: (2)使用aggregate进行统计: (3)使用mapReduce进行统计: 今天我们首先来讲讲mapReduce是如何统计,在后续的文章中,将另起文章进行相关说明. MapReduce是啥呢?以我的理解,其实就是对集合中的各个满足条件的文档进行预处理

MapReduce 编程模型概述

MapReduce 编程模型给出了其分布式编程方法,共分 5 个步骤: 1) 迭代(iteration).遍历输入数据, 并将之解析成 key/value 对. 2) 将输入 key/value 对映射(map) 成另外一些 key/value 对. 3) 依据 key 对中间数据进行分组(grouping). 4) 以组为单位对数据进行归约(reduce). 5) 迭代. 将最终产生的 key/value 对保存到输出文件中. MapReduce 将计算过程分解成以上 5 个步骤带来的最大好处

基于MapReduce编程模型的TFIDF算法研究

基于MapReduce编程模型的TFIDF算法研究 赵伟燕  王静宇 随着Internet等技术的飞速发展,信息处理已经成为人们获取有用信息不可或缺的工具,如何在海量信息中高效地获得有用信息至关重要,因此自动文本分类技术尤为重要.现有的文本分类算法在时间复杂性和空间复杂性上遇到瓶颈,不能满足人们的需求,为此提出了基于Hadoop分布式平台的TFIDF算法,给出了算法实现的具体流程,通过MapReduce编程实现了该算法,并在单机和集群模式下进行了对比实验,同时与传统串行算法进行了对比.实验证明,

hadoop mapreduce编程-大家在实际工作中 mapreduce编程多吗?是怎么用的

问题描述 大家在实际工作中 mapreduce编程多吗?是怎么用的 我们最近的项目 大量的使用hive 因为只要稍带逻辑hive就会走mapreduce ,同事说默认走这个,以后可以写最适合的mapreduce 听得我云里雾里.我想知道什么时候需要自定义mapreduce?进行mapreduce编程?是java做的吗 能给些例子或者链接地址 小弟会非常感谢!

TCP套接字编程模型及实例

摘要:     本文讲述了TCP套接字编程模块,包括服务器端的创建套接字.绑定.监听.接受.读/写.终止连接,客户端的创建套接字.连接.读/写.终止连接.先给出实例,进而结合代码分析.   PS:本文权当复习套接字编程的读书笔记.   一.TCP套接字编程模型     同一台计算机上运行的进程可以利用管道.消息队列.信号量.共享内存等进行相互通信,不同计算机上运行的进程可以通过套接字网络IPC接口进行相互通信.套接字编程基本步骤如下图所示: 图 TCP套接字编程模型[1] 二.源代码     本

c#中异步编程模型变迁及如何使用异步

大家在编程过程中都会用到一些异步编程的情况.在c#的BCL中,很多api都提供了异步方法,初学者可能对各种不同异步方法的使用感到迷惑,本文主要为大家梳理一下异步方法的变迁以及如何使用异步方法. BeginXXX,EndXXX模式 在.Net Framework 2.0中,最常见的方法是BeginXXX,和EndXXX这样的方法来搭配使用.这种模式可以概括为方法+回调方法模式或者称为InvokeMethod+EventHandler模式. 这种模型的基本流程是:     调用BeginXXX方法 

APM之 .net中异步编程模型比较-3

.net中的异步编程模型比较 模型 主要用途 用什么模拟辅助用途 父子 进度报告 取消 等待 超时 返回结果/异常 QueueUserWorkItem 计算 同步I/O No No No No No No Timer 计算 同步I/O No No 通过Dispose No Yes No RegisterWaitForSingleObject 计算 同步I/O No No 通过Unregister No Yes Yes Tasks 计算 同步I/O TaskCompletionSource Tas

JavaScript按日期查询MongoDB中的数据的要点示例_MongoDB

group by date 聚合查询日期 统计每天数据(信息量) 1  { "_id" : ObjectId("557ac1e2153c43c320393d9d"), "msgType" : "text", "sendTime" : ISODate("2015-06-12T11:26:26.000Z") }   2  { "_id" : ObjectId("

PAI分布式机器学习平台编程模型演进之路

什么是PAI? PAI的全称是Platform of Artificial Intelligence,主要在使用机器学习做模型训练时提供整套链路.机器学习即服务,把机器学习作为服务对外推出,大家可以在平台上使用比较先进的机器学习算法.将多种深度学习框架集成到PAI中,同时基于深度学习框架包装成更加易用的组件.具备异构的计算服务能力,把CPU计算能力和GPU计算能力统一调度起来,异构的计算能力透明,大家的注意力是哪些机器学习算法可以帮助业务,不用关心底层资源的申请和分配.PAI也支持在线预测服务,