是否可以在MapReduce中的同一个键下输出多个值?

时间:2017-06-14 07:18:47

标签: java hadoop mapreduce

如果我正在运行MapReduce工作,我可以:

context.write(key, value1)
context.write(key, value2)
context.write(key, value3) ....

在我的mapper函数中?这会像Map中的Java类一样,并覆盖预先存在的值吗?

2 个答案:

答案 0 :(得分:1)

是的,您可以为同一个键设置多个值。 MapReduce中的map函数与Java中的Map结构不同。但是,如果这个类比对您来说更容易,您可以将其视为Multimap,或者像哈希表一样: 您可以将多个值放入同一个存储桶中。

请参阅以下WordCount程序中的示例*(请参阅第二个映射器,两次发出密钥C)。这些键值对最终会在同一个桶中(减少任务):

enter image description here

但是,我有一个问题:你应该尝试避免这种缩减端连接的情况,当地图侧连接适用时,如你的情况那样,出于效率原因。例如,如果您可以在映射器中发出(key, [value1,value2,value3,...]),则通常会更快,因为需要传输和连接的数据更少。既然你已经知道这三个值最终会在同一个reducer中,你可以像reducer那样处理它们,或者做一些有助于reducer执行更少计算的预处理(或者你可以使用一个组合器这个目的)。在上图中,从映射器首先发出(C,2)会更快。

*图中没有正确描述减少阶段,但这与问题无关。

答案 1 :(得分:0)

是的,你可以这样做。每次拨打context.write()时,您都在有效地发出新的键/值对,因此每个调用都与最后一个调用无关,因此它与Map无法真正匹配。