如果我正在運行MapReduce
工作我會允許有:是否可以在MapReduce中的同一個鍵下輸出多個值?
context.write(key, value1)
context.write(key, value2)
context.write(key, value3) ....
我mapper
功能?這是否會像Java
中的Map
類一樣並覆蓋預先存在的值?
如果我正在運行MapReduce
工作我會允許有:是否可以在MapReduce中的同一個鍵下輸出多個值?
context.write(key, value1)
context.write(key, value2)
context.write(key, value3) ....
我mapper
功能?這是否會像Java
中的Map
類一樣並覆蓋預先存在的值?
是的,你可以有多個值爲同一個鍵。 MapReduce中的map函數不像Java中的Map結構。但是,您可以將其視爲Multimap或散列表,如果此類比較容易: 您可以將多個值放入同一個存儲桶。
請參閱以下WordCount程序中的示例*(請參閱第二個映射器,發出兩次密鑰C
)。這些鍵值對將在同一個桶中結束了(reduce任務):
不過,我存在這樣一個問題:你平時應儘量避免減少邊加入這種情況下,當地圖端連接適用時,就像你的情況一樣,出於效率的原因。例如,如果您可以在映射器中發出(key, [value1,value2,value3,...])
,這通常會更快,因爲需要傳輸和連接的數據更少。既然你已經知道這三個值最終會在同一個reducer中,你可以像reducer一樣處理它們,或者做一些預處理來幫助reducer減少計算量(或者你也可以使用組合器這個目的)。在上圖中,從映射器中首先發出(C,2)
會更快。
*縮減階段未在圖中正確顯示,但與問題無關。
是的,你可以做到這一點。每次您撥打context.write()
時,您都會發送新的密鑰/值對,因此每個呼叫都與最後一個呼叫無關,因此與Map
沒有真正的可比性。
是的,允許在mapper
函數中編寫multiple key-value
對MapReduce
算法。以這種方式寫作實際上是正常的。您可以在apache word count中看到context.write(word, one);
寫在while
循環內,這意味着它正在寫入multiple times
。
回答第二個問題的方法是NO
,除非您覆蓋reducer
函數中的鍵。