如果我经营一家 MapReduce 我可以做的工作是:
MapReduce
context.write(key, value1) context.write(key, value2) context.write(key, value3) ....
在我的 mapper 功能?这会不会像 Map 上课时间 Java 并覆盖预先存在的值?
mapper
Map
Java
sg3maiej1#
是的,你能做到。每次调用时都有效地发出新的键/值对 context.write() ,因此每个调用都独立于最后一个调用,因此它实际上无法与 Map .
context.write()
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绘制者那里。
C
(key, [value1,value2,value3,...])
(C,2)
2条答案
按热度按时间sg3maiej1#
是的,你能做到。每次调用时都有效地发出新的键/值对
context.write()
,因此每个调用都独立于最后一个调用,因此它实际上无法与Map
.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绘制者那里。