一: 背景
在利用mongodb的Group进行数据分析的时候,发现 是有限制的,非唯一索引记录数不能大于20000,进而考虑使用MapReduce.
二:MapReduce的命令语法
三:Spring mongodb MapReduce代码实例
实例用来统计某个用户在一定时间端内访问某个系统某个接口的次数,已经花费的总时间。
请参见代码:
在利用mongodb的Group进行数据分析的时候,发现 是有限制的,非唯一索引记录数不能大于20000,进而考虑使用MapReduce.
二:MapReduce的命令语法
db.runCommand(
{ mapreduce : 字符串,集合名,
map : 函数,见下文
reduce : 函数,见下文
[, query : 文档,发往map函数前先给过渡文档]
[, sort : 文档,发往map函数前先给文档排序]
[, limit : 整数,发往map函数的文档数量上限]
[, out : 字符串,统计结果保存的集合]
[, keeptemp: 布尔值,链接关闭时临时结果集合是否保存]
[, finalize : 函数,将reduce的结果送给这个函数,做最后的处理]
[, scope : 文档,js代码中要用到的变量]
[, jsMode : 布尔值,是否减少执行过程中BSON和JS的转换,默认true] //注:false时 BSON-->JS-->map-->BSON-->JS-->reduce-->BSON,可处理非常大的mapreduce,<br> //true时BSON-->js-->map-->reduce-->BSON
[, verbose : 布尔值,是否产生更加详细的服务器日志,默认true]
}
);
|
三:Spring mongodb MapReduce代码实例
实例用来统计某个用户在一定时间端内访问某个系统某个接口的次数,已经花费的总时间。
请参见代码:
点击(此处)折叠或打开
- Log.info("=================gmap 日志收集开始===================================");
- try {
- Date date = new Date();
- Date fromDate = GbdDateUtils.getBeginDate(date);
- Date endDate = GbdDateUtils.getEndDate(date);
- Criteria criteria = Criteria.where("date").gte(fromDate).lt(endDate);
- Query query=new Query(criteria);
-
- String mapFunction = "function Map() {emit({\"userId\":this.userId,\"system\":this.system,\"url\":this.url},{count: 1, time: this.time});}";
- String reduceFunction = "function Reduce(key, values) {var reduced = {count:0, time:0};values.forEach(function(val) {reduced.count += val.count;reduced.time += val.time;});return reduced;}";
- MapReduceResults<LogValueObject> mapReduce = mongoTemplate.mapReduce(query, "logs", mapFunction, reduceFunction,new MapReduceOptions().outputCollection("results"), LogValueObject.class);
-
- logger.info(mapReduce.getCounts());
- //清除已有的日志记录
- gmapSystemLogBo.removeCurDateLogs(fromDate);
-
-
- List<GmapSystemLog> systemLogs = new ArrayList<>();
-
- int i=0;
- for(LogValueObject log:mapReduce)
- {
-
- GmapSystemLog systemLog = new GmapSystemLog();
- systemLog.setUserId(log.get_id().getUserId().intValue());
- systemLog.setUrl(log.get_id().getUrl());
- systemLog.setSystem(log.get_id().getSystem());
- systemLog.setCount(log.getValue().getCount().intValue());
- systemLog.setTime(log.getValue().getTime().intValue());
- systemLog.setDate(fromDate);
- systemLog.setCreateDate(date);
- systemLogs.add(systemLog);
- i++;
- if (0 < i && (i % 1000 == 0)) {
- logger.info("==========保存到数据库===============");
- gmapSystemLogBo.batchInsertLogs(systemLogs);
- systemLogs.clear();
- }
- }
-
-
- if (0 < systemLogs.size()) {
- logger.info("==========保存到数据库(结束页)===============");
- gmapSystemLogBo.batchInsertLogs(systemLogs);
- }
- Log.info("=================gmap 日志收集结束===================================");
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/28624388/viewspace-2107068/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/28624388/viewspace-2107068/