hugh 的个人博客

Everyday is a new day

mongoDB map reduce使用注意点

1. 问题原因

当前时间段内只有一条记录, 经过reduce预处理时并没有进入,导致变量未正确赋值

在finalize中发现变量不存在,导致程序异常

 

2. 原因

参考mapreduce使用的坑 - mac reduce对数据集进行汇总计算时,出现数据样本不全的问题

map reduce 执行过程中, 如果只有一条记录不会进入reduce,但是会进入finalize

 

3. 处理

在finalize中对这种情况单独处理, 返回该条数据项

4. 修改原文code如下

 

o.finalize = function(key, rval) {
function financial(x) {
return Number.parseFloat(x).toFixed(2);
}
// fix 只有一条记录时的bug
if(!result[key]) {
return { dns: rval.dns, tcp:rval.tcp >> 0, ssl:rval.ssl >> 0, ttfb:rval.ttfb >> 0, trans:rval.trans >> 0, dom:rval.dom >> 0, res:rval.res >> 0, firstbyte:rval.firstbyte >> 0,fpt:rval.fpt >> 0,tti:rval.tti >> 0,ready:rval.ready >> 0, load:rval.load >> 0}
}
var sum = result[key].reduce((cur,item) => {
return {dns: (item.dns >> 0) + cur.dns,
tcp:(item.tcp>> 0) + cur.tcp,
ssl:(item.ssl>> 0) + cur.ssl,
ttfb:(item.ttfb>> 0) + cur.ttfb,
trans:(item.trans>> 0) + cur.trans,
dom:(item.dom>> 0) + cur.dom,
res:(item.res>> 0) + cur.res,
firstbyte:(item.firstbyte>> 0) + cur.firstbyte,
fpt:(item.firstbyte>> 0) + cur.firstbyte,
tti:(item.tti>> 0) + cur.tti,
ready:(item.ready>> 0) + cur.ready,
load:(item.load>> 0) + cur.load,
total: item.total + cur.total
}
}, {total:0, dns: 0, tcp:0, ssl:0, ttfb:0, trans:0, dom:0, res:0,firstbyte:0,fpt:0,tti:0,ready:0, load:0})
var len = sum.total;
var sumTotal = {total: len, dns: financial(sum.dns/len), tcp:financial(sum.tcp/len), ssl:financial(sum.ssl/len), ttfb:financial(sum.ttfb/len), trans:financial(sum.trans/len), dom:financial(sum.dom/len),
res:financial(sum.res/len),firstbyte:financial(sum.firstbyte/len),fpt:financial(sum.fpt/len),tti:financial(sum.tti/len),ready:financial(sum.ready/len), load:financial(sum.load/len)}

        return sumTotal
    }

 

 


标题:mongoDB map reduce使用注意点
作者:hugh0524
地址:https://blog.uproject.cn/articles/2019/07/04/1562224171165.html