前面已经简单介绍了MongoDB在OECP社区的一个应用:动态消息的设计实现。在上次的应用中,我们只介绍了MongoDB最基本的查询的功能,今天我再介绍一下MongoDB更加高级的应用:用MongoDB做统计分析。
OECP社区中,我们为了更加准确的分析网站的访问情况,以便能够为用户更准确的推荐他们感兴趣的内容,我们需要将页面的访问记录存储下来。对于这些数据,主要由以下几个特点:
- 与业务无关,尽量将数据存储和业务数据分离,减少业务数据库的压力。而且对数据的一致性要求不高。
- 每当访问一个页面就要存储一条记录,实时插入操作的要求很高,当然可以使用缓存作为临时缓冲来解决数据频繁更新的问题。
- 数据随着访问量的增长膨胀的很快,如果一个页面1天有100个PageViews,将会新增100条数据,数据量远远高于业务数据,而且要比我们上次说的消息动态的数据的数量级要大得多。网站要尽量存储至少两个月的数据,当网站访问量很大的时候,要解决的是海量数据的存储。
所以从存储上考虑,我们依然选择了MongoDB作为持久存储。由于NoSQL数据库在数据查询的多样性能力太低,特别是标准的Key-Value数据库,一般的做法就是用NoSQL负责日志的存储,分析需要将数据抽取到关系数据库中再进行统计查询。但是MongoDB却提供给我们非常丰富的查询统计功能,group 和MapReduce都能实现SQL中group by,sum,count之类的统计查询分析。Group的功能已经可以实现简单的统计功能,但是当数据量非常大的时候,group处理能力就不太好了,所以我们一开始就使用MapReduce进行统计分析。
先看一下官方对MapReduce的介绍:
db.runCommand(
{ mapreduce : <collection>,
map : <mapfunction>,
reduce : <reducefunction>
[, query : <query filter object>]
[, sort : <sort the query. useful foroptimization>]
[, limit : <number of objects to returnfrom collection>]
[, out : <output-collection name>]
[, keeptemp: <true|false>]
[, finalize : <finalizefunction>]
[, scope : <object where fields go into javascript global scope >]
[, verbose : true]
}
);
而java驱动下提供的方法主要有两个:
DBCollection.mapReduce(String map, String reduce,String outputCollection,
DBObject query);
DBCollection.mapReduce(DBObject command);//该接口按照上面的介绍,总是报错,不知道此该如何应用
PV数据存储结构:(这些属性主要是为了支持我们以后根据各种维度去分析)
entityId:实体ID,
entityName:实体名称,
userid:(登录)访问者ID,
sessionId:会话ID,
referer:来源URL,
url:当前页面url,
title:显示的标题,
date:访问时间,
ip:访问者IP
第一个应用场景:当访问某用户的空间时,得到某用户最新的访问记录,同一个页面重复访问的话,返回最新的一次访问。
- 首先是map方法,主要是定义outputCollection的结构。OutputCollection的输出结构为:{_id:key,value:value}
java 代码
- String mapfun = "function(){emit({url:this.url,title:this.title},this.date)}";
java 代码
- String reducefun = "function(key,vals){var date=0; for(var i in vals){ if(date==0){date=vals[i];}else if(vals[i]>date){date=vals[i];}} return date;}";
java 代码
- DBObject query = newBasicDBObject();
-
query.put("userid", userid);
-
query.put("date", newBasicDBObject("$gte", fromDate));
-
*.getCollection().mapReduce(mapfun, reducefun,"pageview_results", query);
- 遍历pageview_results集合的结果:[{_id:{url:”/blog/yongtree/258”,title:’博客1’},value:’2010-10-11 20:30:56’},{_id:{url:”/blog/slx/288”,title:’博客2’}, value:’2010-10-01 02:23:33’}]
注意:mapfun和reducefun字符串里面是写的javascript的方法,MongoDB可以在服务器端进行js的解析。如果这个方法写的不对,程序将不能正常执行。
第二个应用场景:当访问某个具体的内容时,返回某段时间曾经浏览过这篇文章的其他人关注的其他内容,以便对当前用户有一个内容的引导。
- 首先先找出某段时间内曾经访问该内容的人作为统计的条件,我们使用sessionId而不是userid,是为了将没有登录的用户的访问算进来一起统计
java 代码
- DBObject query = newBasicDBObject();
-
query.put("entityId", entityId);
-
query.put("entityName", entityName);
-
query.put("date", newBasicDBObject("$gte", fromDate));
-
query.put("date", newBasicDBObject("$lt", toDate));
-
List sessionIds = this.mongoService.getCollection().distinct("sessionId", query);
- 定义map方法,主要是定义outputCollection的结构。OutputCollection的输出结构为:{_id:key,value:次数浏览的次数}
java 代码
- String mapfun = " function(){emit({url:this.url,title:this.title},1)}";
java 代码
- String reducefun = " function(key,vals){var count=0; for(var i in vals){count+=vals[i];} return count;}";
java 代码
- *.getCollection().mapReduce(mapfun, reducefun,"pageview_results", new BasicDBObject("sessionId",new BasicDBObject("$in",sessionIds.toArray())));
- 遍历pageview_results集合的结果:[{_id:{url:”/blog/yongtree/258”,title:’博客1’},value:’45.0’},{_id:{url:”/blog/slx/288”,title:’博客2’}, value:’30.0’}]
前台展现的效果:
继续关注OECP社区,我们将会实践和发布更多基于MongoDB的应用。本着共享的精神,该文档可以被转载和应用,但是要注明出处。
作者主页:http://www.po-soft.com/hi/yongtree
分享到:
相关推荐
总结来说,MongoDB的MapReduce功能为我们提供了一种有效处理和分析大规模订单数据的方法,通过自定义的map和reduce函数,可以实现各种复杂的统计需求,这对于理解和优化业务表现非常有价值。在电子商务领域,这样的...
MapReduce在MongoDB中的应用场景广泛,例如统计分析、聚合操作、数据转换等。对于大数据处理,MapReduce提供了一种有效的解决方案,能够在分布式环境中并行处理数据,显著提高处理速度。然而,需要注意的是,尽管...
《基于大数据的统计分析方法和工具》 大数据的崛起引领了全新的统计分析方式,它不仅改变了数据处理的格局,还催生了一系列创新工具和技术。本文将深入探讨大数据统计分析的背景、方法、工具及其在各行业的实际应用...
3. **数据分析与报表设计**: Chapter 4可能深入到了数据分析部分,使用Pentaho Report Designer创建基于MongoDB数据的报表和仪表板。这可能涵盖如何设计和布局报表、使用聚合函数、应用过滤条件、以及创建图表和图形...
通过这个示例,我们可以看到MongoDB的MapReduce是如何处理大数据的,它提供了灵活性和可扩展性,使得在数据库级别进行复杂的聚合和分析成为可能。然而,需要注意的是,对于大型数据集,MapReduce可能不是最高效的...
本文将基于“MongoDB权威指南”和“深入MongoDB”这两本书籍,详细介绍MongoDB的核心概念、功能特性以及如何进行有效的学习和实践。 1. MongoDB基础: MongoDB使用JSON-like的BSON数据格式存储数据,这种格式便于...
- MongoDB还支持聚合操作,通过`aggregate()`函数进行数据统计和分析。 6. 高级特性: - MapReduce:用于大数据处理,通过定义映射和规约函数执行分布式计算。 - GridFS:用于存储大文件,将文件分割成多个块并...
在MongoDB中,聚合是用于处理数据记录并返回计算结果的过程,通常用于汇总数据、进行统计分析或者生成分组报告。本资料主要涉及MongoDB中的简单聚合函数,包括`count`、`distinct`和`group`等。 1. **count** 函数...
8. MapReduce:MongoDB支持MapReduce函数,用于进行批量数据处理和分析,适合大数据场景。 9. 副本集:副本集是MongoDB提供高可用性的一种方式,由一个主节点和多个从节点组成。主节点负责写操作,从节点实时同步主...
MongoDB作为一种高性能、开源的NoSQL数据库,它主要存储的数据格式是基于文档的,使用类似于JSON(JavaScript Object Notation)的格式。MongoDB非常适合处理大量的数据,尤其是对大数据的存储和处理具有非常大的...
例如,下面展示了如何使用MapReduce统计不同部门和职位的员工人数: ```javascript var map1 = function (){emit({"job":this.job,"dep":this.dep},1);} var reduce1 = function(key,values){return Array.sum...
1. 全内存计算:Spark的核心是基于内存计算的,这使得它在执行任务时可以比基于磁盘的系统(比如Hadoop MapReduce)快上100倍。 2. 通用性:Spark提供了丰富的API,支持Java、Python、Scala和R语言,适用于多种数据...
本案例主要围绕基于招聘网站的离线统计及实时分析系统展开,目的是让学生理解和掌握大数据在实际工业场景中的应用。在《大数据架构与技术》课程中,这个案例将帮助学生学习和实践大数据预处理、数据分析以及大数据...
本案例重点是基于招聘网站的离线统计与实时分析系统,旨在利用大数据技术改善求职者的就业体验。 1. **数据采集**: - 使用爬虫技术,如Python的Scrapy框架,从热门招聘网站(如51job)抓取特定岗位信息,如Java、...
MapReduce则适用于处理复杂统计分析、推荐引擎、趋势分析等任务,如RCFile的行列混合存储优化了MapReduce的效率。 (三) 基于Hadoop的多维分析平台 Hadoop因其出色的可扩展性、健壮性、计算性能和成本效益,成为...