在功能点统计中,我是用mongodb所提供的mapreduce功能所实现的。关于mongodb,其实并没有多少可说的。简单的概述一下,它其实不过是一个可以存放很多json的仓库,只不过它对于json做了优化,使用二进制存储,改了个名叫做bson,这不过是很多年前就有的面向对象数据库的新的实现。至于性能,也可以简单的认为它自带了一个缓存,与硬盘做异步同步。这些其实都是很无趣的东西,真正有意思的,是它带了一个mapreduce工具(虽说,实现的真的很烂)。
mapreduce在我看来,是在互联网时代,一个程序员必须去了解的概念。在中文维基中,mapreduce被这样定义:“MapReduce是Google提出的一个软件架构,用于大规模数据集(大于1TB)的并行运算”。其实,这不准确,它其实是函数式语言中由来已久的一个概念。只不过,在这个互联网上信息爆炸的年代,google帮我们发现了它。
顾名思义,mapreduce分两部分,map和reduce。
map函数的定义为Map(k1,v1) → list(k2,v2)
reduce函数的定义Reduce(k2, list(v2)) → list(v3)
简单的描述一下,map接收一个list,通过某一个函数,把它变成另一个list。在这个过程中,对list中任一元素的变换都与其他操作无关。这样的函数天生具备了并行计算的能力。而reduce,它通过某种操作,具体来说也是通过一个函数,把接收到的list转变为一个简单的结果。reduce函数不是那么方便并行,所以通常mapreduce框架会把reduce操作集中到某个特定的节点进行。
看一下功能点统计中一段具体的mapreduce函数
var map =function () {
var a = new Date,
d = new Date(a.getFullYear(), a.getMonth(), a.getDate()),
e = this.auid;
this.features.forEach(function (b) {
var a = b.log.length,
c = 0;
b.log.forEach(function (a) {
a > d && c++
});
emit({
auid: e,
fid: b.id,
fname: b.name,
version: b.version
}, {
total: a,
today: c
})
})
}
在这段函数中,前面具体的逻辑操作不重要,重要的是后面的emit函数。这个函数由mongodb提供,在这个例子中,它将原始数据进行分割,分割结果是这样的结构
[{_id:{auid:xxx,fid:xxx,fname:xxx,version:xxx},value:[{total:xx,today:xxx}....]}]
换句话说,emit的作用就是根据第一个参数提供的属性,将原始数据分割为一个新的list
这里是reduce函数
var reduce = function (d, c) {
var a = {
total: 0,
today: 0
};
c.forEach(function (b) {
a.total += b.total;
a.today += b.today
});
return a
}
这个函数看起来就简单很多了,它要做的就是,接收上一个list中某个元素的value的值,这是一个小的list,把它变成一个对象输出。
从逻辑上可以看到,这个reduce对之前那个list的每个元素要执行一次,这个调度工作由mongodb执行。最终,这些输出结果合并到一起,变成新的list,成为我们的最终结果。
之前提到,我对mongodb的mapreduce其实非常不满。原因很多,首先它不能利用index,导致性能不高;其次,它对mapreduce所用到的数据有诸多限制;最重要的一点,其实是它根本没有很好的实现并行:在单机环境下,mongodb的mapreduce只能单线程运行,在分布式环境下有限制了很多有用的特性。这样看来,mongodb的mapreduce事实上只是起到了一个简单的group by作用,而不是一个真正最强有力的并行计算工具。在这里,我的观点是研究mapreduce的思想,远比研究mongodb的这个实现有价值的多。
分享到:
相关推荐
mongodb mapreduce 实例,该例子主要用来做订单统计的。具体问题请到博客提问。
NULL 博文链接:https://superhuo.iteye.com/blog/1193485
MongoDB MapReduce MapReduce是一种计算模型,简单的说就是将大批量的工作(数据)分解(MAP)执行,然后再将结果合并成最终结果(REDUCE)。这样做的好处是可以在任务被分解后,可以通过大量机器进行并行计算,减少...
MapReduce应该算是MongoDB操作中比较复杂的了,下面这篇文章主要给大家介绍了关于MongoDB中MapReduce使用的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面随着小编来一起看看吧。
Mongodb是针对大数据量环境下诞生的用于保存大数据量的非关系型数据库,针对大量的数据。接下来通过本文给大家介绍Mongodb中MapReduce实现数据聚合方法详解,感兴趣的朋友一起学习吧
一个简单的Mongodb mapreduce的例子
MongoDB的MapReduce.pdf 学习资料 复习资料 教学资源
1.分篇章进行学习,内容控制30分钟内 2.1个月疗程,不要放弃治疗哦 3.图文并茂,有问题请发到邮箱
计算机后端-PHP视频教程. mongodb10 MapReduce 统计栏目下的商品.wmv
计算机后端-PHP视频教程. mongodb08 导出导入.wmv
MapReduce 是 Google 在 2004 年发布的一个软件框架,用于支持大规模数据的分布式计算。 MongoDB 是一个开源的面向文档的 NoSQL 数据库系统,使用 C++ 编写。
作为一个优秀的编程模型,MapReduce在大数据处理中有很大的优势,而mongodb也支持这一编程模型,本文通过简单的单词计数示例论述在mongodb中如何使用MapReduce
项目: 项目1:项目2: 项目3: 项目4: 项目5: 项目6: 项目7:所修课程: 描述性统计推论统计Python简介数据科学导论使用MongoDB进行数据整理用R进行数据分析机器学习入门数据... MongoDB MapReduce R(inc...
主要介绍了MongoDB学习笔记之MapReduce使用示例,本文直接给出实例代码,需要的朋友可以参考下
#资源达人分享计划#
MongoDB五分钟教程:MongoDB Shell入门 基于MongoDB进行分布式数据存储的步骤 MongoDB分布式存储的MapReduce并行查询 实例:MongoDB与Tomcat的结合更便捷
MongoDB 上的映射减少 马特乌斯·米奥特克04/01/2015 Sprzęt: Laptop ACER ASPIRE ONE 5820TG Procesor: Intel core I5-430M Ilość pamięci RAM: 8 GB Dysk twardy: SSD SanDisk 128 GB System Operacyjny: ...