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

fafcakar  于 2021-06-01  发布在  Hadoop
关注(0)|答案(2)|浏览(420)

如果我经营一家 MapReduce 我可以做的工作是:

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

在我的 mapper 功能?这会不会像 Map 上课时间 Java 并覆盖预先存在的值?

sg3maiej

sg3maiej1#

是的,你能做到。每次调用时都有效地发出新的键/值对 context.write() ,因此每个调用都独立于最后一个调用,因此它实际上无法与 Map .

mrzz3bfm

mrzz3bfm2#

是的,同一个键可以有多个值。mapreduce中的map函数与java中的map结构不同。不过,您可以将其视为一个multimap,或者类似于一个哈希表,如果这种类比对您来说比较容易的话:您可以将多个值放入同一个bucket。
请参阅下面的wordcount程序*中的一个示例(请参阅第二个Map器,发出键 C 两次)。这些键值对将在同一个bucket中结束(reduce task):

然而,我发现其中有一个问题:出于效率的考虑,当map-side连接适用时,通常应该尽量避免这种reduce-side连接的情况。例如,如果可以发射 (key, [value1,value2,value3,...]) 在mapper中,这通常会更快,因为需要传输和连接的数据更少。因为您已经知道这三个值最终将出现在同一个reducer中,所以您可以像reducer那样处理它们,或者进行某种预处理,以帮助reducer执行较少的计算(或者您也可以为此使用组合器)。在上一个图中,发射速度会更快 (C,2) 首先从Map绘制者那里。

  • 图中没有正确描述reduce阶段,但这与问题无关。

相关问题