使用MongoDB的MapReduce-reduce运行了多少次?
我在MongoDB中使用MapReduce,我想我已经对它了如指掌了,但有一点我仍然不明白:reduce运行了多少次 例如,我有一个“项目”集合,每个项目都有一个“类别”。这是测试数据(用javascript编写,用于node.js单元测试): 共有6个项目,5个类别,其中一个类别出现两次,其余一次 在我的使用MongoDB的MapReduce-reduce运行了多少次?,mongodb,mapreduce,Mongodb,Mapreduce,我在MongoDB中使用MapReduce,我想我已经对它了如指掌了,但有一点我仍然不明白:reduce运行了多少次 例如,我有一个“项目”集合,每个项目都有一个“类别”。这是测试数据(用javascript编写,用于node.js单元测试): 共有6个项目,5个类别,其中一个类别出现两次,其余一次 在我的map函数中,我发出(this.category.categoryId,{items:1})。(完整的版本包括除#项之外的值对象中的其他度量,但这两种方式的行为都是相同的。) 我的reduce
map
函数中,我发出(this.category.categoryId,{items:1})代码>。(完整的版本包括除#项之外的值对象中的其他度量,但这两种方式的行为都是相同的。)
我的reduce
函数如下所示:
function reduce(key, values) {
var totals = {
items: 0
};
for (var i = 0; i < values.length; i++) {
totals.items += values[i].items;
}
return totals;
};
功能减少(键、值){
风险值总计={
项目:0
};
对于(变量i=0;i
(map中的输出结构与reduce中的输出结构相同,这是需要的。)
因此,我通过mapReduce使用verbose=true
运行了这个程序,它显示了以下统计信息:
计数:{输出:5,发射:6,减少:1,输入:6}
输入:6个有意义,共有6个文档。
emit:6有意义,它为每个文档发出1个类别。
输出:5个有意义,有5个类别。
但为什么reduce只运行一次呢
现在写出来,它似乎在为每一个出现不止一次的发出的键运行reduce。因此,当一个键只发出一次时,它不会减少它。对吗?确定减少运行次数的数学公式是什么
谢谢大家! 是的,如果只发出一次键,reduce不会运行,这是正确的。我不认为存在一个数学公式可以告诉你reduce将运行多少次 只要有必要。对于大数据集,单个reduce调用将在节点之间分割并同时运行。单个reduce作业块的大小将根据配置的不同而有所不同-文档中说,单个emit不能超过
最大文档大小的一半,所以我认为这意味着最大reduce批处理将具有最大文档大小
function reduce(key, values) {
var totals = {
items: 0
};
for (var i = 0; i < values.length; i++) {
totals.items += values[i].items;
}
return totals;
};