我是MongoDB的初學者,我只是想知道Map-Reduce中MongoDB的Finalize函數/步驟的功能是什麼。我們在finalize()函數中所做的所有事情實際上都可以在reduce函數中完成。我只是想知道是什麼迫使我們使用finalize。我對此進行了研究並沒有發現任何東西。非常感謝您的幫助完成MongoDB Map-Reduce步驟
3
A
回答
5
其中一個最大的原因是在最後一組數據上完成所有事情之後,執行完成。不僅如此,最終確定也可以在單個結果上運行,而減少將跳過單個結果。
如果您可以盡一切辦法減少然後使用減少,您不需要最終確定。
3
雖然我知道這個問題被問和3年前回答,我有同樣的問題,並推斷未來的Google可能會發現這個額外的信息有所幫助:reduce()
可稱爲multiple times使用相同的密鑰,有些傳給值它是由以前的reduce()
調用返回的。這可能是因爲該集合沒有按相關密鑰,incremental Map-Reduce,parallel execution等進行排序。這就是爲什麼reduce()
應該始終返回與emit()
相同類型的值的原因,例如map()
。
所以我們說你map
功能只是發出每個文檔單號,你使用你reduce
函數來計算每個鍵的總和,平均:
function reduce(key, values) {
var resultObj = {
sum: Array.sum(values)
};
resultObj.average = result.sum/values.length;
return resultObj;
}
在這種情況下,你的代碼的行爲錯誤地如果它通過一個包含resultObj
的數組,因爲我不確定當Array.sum()
傳遞一個數字和對象的對象時會發生什麼。即使這不是問題,此代碼將忽略任何以前計算的平均值並返回不正確的結果。另一方面,只調用一次,所以它可以返回任何想要的內容,並且(如接受的答案所述)在所有數據處理完畢後運行。所以爲了正確地完成上述工作,不要在地圖階段只發出一個數字,而應該發出類似{ 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
};
}
相關問題
- 1. 通過boto獲取Amazon Elastic MapReduce作業流中已完成步驟的數量
- 2. SonarQube無法完成構建後步驟
- 3. Unix步驟將不會完成
- 4. 春季批次+完成某個步驟
- 5. TeamCity同步構建步驟或等待一步完成
- 6. jquery - 多步驟進度條顯示Yii2中已完成的步驟
- 7. CreateUserWizard - 添加步驟,但不要創建用戶,直到所有步驟完成
- 8. 我可以等待完成的異步步驟,然後返回?
- 9. 如何等待直到完成異步步驟?
- 10. mapreduce工作中的應用主數量?在YARN中使用mapreduce處理步驟
- 11. 異步步驟,等待所有步驟成功或失敗
- 12. MongoDB多步驟事務問題
- 13. 生成實體的步驟
- 14. Specflow並生成步驟
- 15. MapReduce for PHP MongoDB?
- 16. Mongodb Java MapReduce getOutputCollection
- 17. MongoDB的MapReduce的報表生成
- 18. 需要使用1個sql來完成這3個步驟
- 19. 什麼配置步驟需要完成ADFS WEB SSO
- 20. FormWizard單擊Chrome上的後退按鈕完成()步驟
- 21. 如何使SpecFlow VS自動完成尊重步驟範圍?
- 22. jenkins沒有完成「執行Windows命令」步驟
- 23. 這個代碼可以用更少的步驟完成嗎?
- 24. 使用cURL閱讀,完成一些步驟,然後發佈
- 25. foreach循環等到每個步驟每個功能完成
- 26. 如何使用Cucumber選擇自動完成值步驟定義
- 27. TeamCIty 6.5.6 Runner Type =「Command Line」的構建步驟永不完成
- 28. 完成步驟在Windows上安裝Ruby on Rails
- 29. TFS2010團隊構建 - 等待「InvokeProcess」步驟完成
- 30. 完成後執行EasyMock.replay()在黃瓜給定的步驟
這是一個很好的解釋 – pinturic