如果我正在运行MapReduce
工作,我可以:
context.write(key, value1)
context.write(key, value2)
context.write(key, value3) ....
在我的mapper
函数中?这会像Map
中的Java
类一样,并覆盖预先存在的值吗?
答案 0 :(得分:1)
是的,您可以为同一个键设置多个值。 MapReduce中的map函数与Java中的Map结构不同。但是,如果这个类比对您来说更容易,您可以将其视为Multimap,或者像哈希表一样: 您可以将多个值放入同一个存储桶中。
请参阅以下WordCount程序中的示例*(请参阅第二个映射器,两次发出密钥C
)。这些键值对最终会在同一个桶中(减少任务):
但是,我有一个问题:你应该尝试避免这种缩减端连接的情况,当地图侧连接适用时,如你的情况那样,出于效率原因。例如,如果您可以在映射器中发出(key, [value1,value2,value3,...])
,则通常会更快,因为需要传输和连接的数据更少。既然你已经知道这三个值最终会在同一个reducer中,你可以像reducer那样处理它们,或者做一些有助于reducer执行更少计算的预处理(或者你可以使用一个组合器这个目的)。在上图中,从映射器首先发出(C,2)
会更快。
*图中没有正确描述减少阶段,但这与问题无关。
答案 1 :(得分:0)
是的,你可以这样做。每次拨打context.write()
时,您都在有效地发出新的键/值对,因此每个调用都与最后一个调用无关,因此它与Map
无法真正匹配。