今天研究在mongodb里加js,然后在mapreduce里调用js。
1. finalize里貌似不能使用外部定义的js,但是在finalize里可以自己写js, 例如扩展array。
2. mapreduce的reduce会产生冗余数据,但是最后finalize的时候,冗余被处理掉了,想求原理。
我做了个测试:
m = function Map() {
emit(this.PEPDATE, {TRANNUM: this.TRANNUM});
}
r = function Reduce(key, values) {
var trannum = 0;
var result = {TRANNUM: 0};
values.forEach(function(v){
trannum += v.TRANNUM;
result.TRANNUM += v.TRANNUM;
});
log(key, trannum);
return result;
}
f = function Finalize(key, reduced) {
return reduced;
}
log的定义:
function (i,j) {
db.log.save({key:i, value: j});
}
log出来的结果
key value
20120130 5081
20120130 3386
20120130 3530
20120130 3880
汇总值是 15877
finalize后的值是 15874, 这多余的3 怎么被处理掉了,求解惑。
难道奥秘就在于 var result,这个mr全局变量么?
1. finalize里貌似不能使用外部定义的js,但是在finalize里可以自己写js, 例如扩展array。
2. mapreduce的reduce会产生冗余数据,但是最后finalize的时候,冗余被处理掉了,想求原理。
我做了个测试:
m = function Map() {
emit(this.PEPDATE, {TRANNUM: this.TRANNUM});
}
r = function Reduce(key, values) {
var trannum = 0;
var result = {TRANNUM: 0};
values.forEach(function(v){
trannum += v.TRANNUM;
result.TRANNUM += v.TRANNUM;
});
log(key, trannum);
return result;
}
f = function Finalize(key, reduced) {
return reduced;
}
log的定义:
function (i,j) {
db.log.save({key:i, value: j});
}
log出来的结果
key value
20120130 5081
20120130 3386
20120130 3530
20120130 3880
汇总值是 15877
finalize后的值是 15874, 这多余的3 怎么被处理掉了,求解惑。
难道奥秘就在于 var result,这个mr全局变量么?