MongoDB MapReduce 实战<4>

  • 有了昨天的顺利,今天就更有信心了,今天要做的是取得区间记录数,为前台统计图表准备数据,举例来说效果就是,
    在1天内出现了XX次,在2天内出现了XX次,在3天内出现了XX次 (不包括上一区间的数据)
  • 分析了一下,可以在昨天的第二个步骤获得的数据进行操作(ttt_date_out表,数据内容形如{ID:1,Times:[1,2,3,....]}),Map和Reduce也和昨天的类似
  • 编写Map
    function Map() {
    	var times = this.value.times;
    	if(times){
    		if(times.length > 1){
    			for(var i = 0;i < times.length;i++){
    				if(i != times.length - 1){
    					var between_time = times[i] - times[i+1];
    					// 向上取整,1.4,1,7都会变成2,意思表示为“两天内”
    					var day = Math.ceil(between_time / (1000 * 60 * 60 * 24));
    					emit(
    						day, 1
    					); 
    				}
    			}
    		}
    	}
    }
  • 编写Reduce
    function Reduce(key, values) {
    	var reduced = {key:key, count:0};
    	values.forEach(function(val) {
    		reduced.count++; 
    	});
    	return reduced;	
    }
  • 得到结果,达到预期,但还是不太理想,对于只有一次map的数据和多次map的数据,结果表示有点不一样

  • 公司上不了谷歌,就只能问度娘了,无解,自己来吧,想到了昨天用到的Finalize
  • 编写Finalize
    function Finalize(key, reduced) {
    	if(reduced.count){
    		return reduced.count;
    	}else{
    		return reduced;
    	}
    }
  • 浪费了一些时间,不过船小好调头,例子小好瞎试,最终效果

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值