gpt4 book ai didi

mongodb - MongoDB Map-Reduce 中的完成步骤

转载 作者:可可西里 更新时间:2023-11-01 09:06:55 25 4
gpt4 key购买 nike

我是 MongoDB 的初学者,我只是想知道 MongoDB 的 Finalize 函数/步骤在 Map-Reduce 中的作用是什么。我们在 finalize() 函数中所做的一切实际上都可以在 reduce 函数中完成。我只是想知道是什么迫使我们使用 finalize。我对此进行了研究,但一无所获。非常感谢你帮助我

最佳答案

虽然我知道这个问题是在 3 年前提出和回答的,但我也有同样的问题,并且认为 future 的 googlers 可能会发现这个额外的信息有用:reduce() 可能被称为 multiple times使用相同的键,传递给它的一些值是之前 reduce() 调用返回的值。这可能是因为集合未按相关键排序,即 incremental。 Map-Reduce,parallel execution等。这就是为什么 reduce() 应该始终返回由 map() 传递给 emit() 的相同类型的值,例如。

假设您的 map 函数只是为每个文档发出一个数字,并且您使用 reduce 函数来计算每个键的总和和平均值:

function reduce(key, values) {
var resultObj = {
sum: Array.sum(values)
};

resultObj.average = result.sum / values.length;
return resultObj;
}

在这种情况下,如果向代码传递一个包含 resultObj 的数组,您的代码将表现错误,因为我不确定 Array.sum() 时会发生什么> 传递了一个数字和对象的对象。即使这不是问题,此代码也会忽略任何先前计算的平均值并返回不正确的结果。

finalize(),另一方面,只被调用一次,所以它可以返回它想要的任何东西,并且(正如接受的答案提到的那样)它在处理完所有数据后运行.因此,要正确执行上述操作,而不是在映射阶段只发出一个数字,您会发出类似 { sum: myVal, count: 1 } 的内容。那么您的 reduce 函数将是:

function reduce(key, values) {
var resultObj = {
sum: 0,
count: 0
};

for (var i in values) {
resultObj.sum = resultObj.sum + values[i].sum;
resultObj.count = resultObj.count + values[i].count;
}

return resultObj;
}

...最后您可以在 finalize 中计算平均值:

function finalize(key, reducedValue) {
return {
sum: reducedValue.sum,
average: reducedValue.sum / reducedValue.count
};
}

关于mongodb - MongoDB Map-Reduce 中的完成步骤,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24835829/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com