MongoDB MapReduce 实战<5>

  • 开始真正的实战了,表数据约100w条,今天先解决第一个需求,也就是求平均记录产生的时间,直接运行《实战 2》已经编写的MapReduce。
  • 出现异常,
    1. 无结果,只要加入{sort},就无结果,查找资料,说必须要建立索引才可加入sort(但是之前数据量小的时候,程序运行良好),建立索引后,在sort处,输入{'CREATE_DATE':-1},出现结果,问题解决
    2. 结果中,许多记录的TIMES字段中的日期并没有排序,且呈不规则,比如这次运行完MapReduce是这条记录的Times排序有问题,但是再次运行MapReduce后,这条记录的Times排序又没有问题,怀疑与多线程有关?只能在Finalize中对结果重新进行排序操作
  • 增加Finalize,对日期进行排序
    function Finalize(key, reduced) {
    	if(reduced.times){  
    		reduced.times.sort(function(x, y){
    			return x < y ? 1 : -1;
    		});
        }  
    	return reduced;
    }
  • In & Out 也作出相应的修改,去掉没用的排序操作了

  • 好,继续运行第二个求平均值的MapReduce(《实战3》中),继续报异常
    1. NaN,非数字异常,导致这个问题的原因很简单,但是却花了我不少时间,原因为超过了数据类型的最大范围,需要修改MapReduce,不做整体累加后除整个次数,改为两个数一加后,直接就求平均值
  • 修改Map
    function Map() {
    	var temp = 0.0;
    	var times = this.value.times;
    	if(times){
    		if(times.length > 1){
    			for(var i = 0;i < times.length;i++){
    				if(i != times.length - 1){
    					temp += times[i] - times[i+1];
    					temp = temp / 2
    				}
    			}
    		}
    		emit(
    			'Result', 
    			temp
    		); 
    	}
    }
  • 修改Reduce
    function Reduce(key, values) {
    	var ret = {msg:key};
    	var temp = 0.0;
    	for(var i = 0;i < values.length;i++){
    		if(i > 0){
    			temp += values[i];
    			temp = temp / 2
    		}
    	}
    	ret.arv_time = temp;
    	return ret;
    }
  • 由于出现了双精度,所以Finalize也需要稍微修改
    function Finalize(key, reduced) {
    	// 转成秒 
    	var second = parseInt(reduced.arv_time / 1000.00);
        // 转分钟
    	var minute = parseInt(second / 60);
    	// 剩余秒
    	var s = second % 60;
    	// 转小时
    	var hour = parseInt(minute / 60);
    	// 剩余分
    	var m = minute % 60;
    	// 转天
    	var day = parseInt(hour / 24);
    	// 剩余小时
    	var h = hour % 24;
        return day + " 天 " + h + " 小时 " + m + " 分钟 " + s + " 秒 ";
    }
  • 最终结果

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值