完成MongoDB Map-Reduce中的步骤

Yud*_*oro 4 mapreduce mongodb

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

Dav*_*sch 12

虽然我知道这个问题是在3年前被问及回答的,但我有同样的问题,并认为未来的googlers可能会发现这些额外的信息很有帮助:reduce()可能会使用相同的密钥多次调用,其中一些值传递给它是什么以前的reduce()电话回来了.这可能是因为集合没有按照有问题的键,增量 Map-Reduce,并行执行等进行排序.这就是为什么reduce()应该总是返回相同类型的值,例如传递给emit()map().

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

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

    resultObj.average = result.sum / values.length;
    return resultObj;
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,如果传递包含a的数组,您的代码将会出错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;
}
Run Code Online (Sandbox Code Playgroud)

...然后最后你可以计算平均值finalize:

function finalize(key, reducedValue) {
   return {
     sum: reducedValue.sum,
     average: reducedValue.sum / reducedValue.count
   };
}
Run Code Online (Sandbox Code Playgroud)

  • 这是一个很好的解释 (2认同)

Sam*_*aye 5

其中一个最大的原因是,在最终数据集完成所有内容之后运行finalize.不仅如此,最终确定也可以在单个结果上运行,而减少将跳过单个结果.

如果您可以在reduce中执行所有操作,则使用reduce,您无需进行最终确定.