如何找到一个特定的键值对作为reducer

时间:2017-02-07 14:19:28

标签: hadoop mapreduce

我需要找到使用MR

的最大分数的学生
Paul 90
Ben 20
Cook 80
Joe 85

因此减速器的输出应该是(保罗90)

任何人都可以帮我这个吗?

3 个答案:

答案 0 :(得分:1)

您可以将所有输入元组映射到同一个键,其值与每个输入元组相同,如(一键,(Ben,20)),并使用仅返回元组的reduce函数具有最高等级(因为只有一个键)。

为了确保MR并行性能够发挥作用,使用与reducer具有相同功能的组合器(上图)应该可以解决问题。这样,reducer只会从每个mapper中获得一个元组,而且工作量也会减少。

编辑:更好的是,您已经可以消除映射函数中除最大值之外的所有内容以获得最佳性能(请参阅Venkat的评论,即不能保证使用组合器)。

两个映射器的示例:

Paul 90
Ben 20
Cook 80
Joe 85

映射到:

Mapper 1
(the-one-key, (Paul, 90))
(the-one-key, (Ben, 20))

Mapper 2
(the-one-key, (Cook, 80))
(the-one-key, (Joe, 85))

结合(仍然在地图选集方):

Mapper 1
(the-one-key, (Paul, 90))

Mapper 2
(the-one-key, (Joe, 85))

缩减为:

(the-one-key, (Paul, 90))

最后一句话:如果你有一个小数据集,MapReduce可能会“太多”。如果您只有几百或几千个值,则在本地内存中进行简单扫描会更快。

答案 1 :(得分:1)

这样做的一个好方法是在Hadoop中进行二次排序。您的地图输出键应该是(名称,标记)的组合。

然后,您将实现一个自定义比较器,可以使用此键和基于标记仅比较2个给定值并基于更高标记排序。

通常我们实现分组比较器,但在这种情况下,我们希望所有键都进入单个reducer。所以我们会忽略分组比较器中的关键差异。

在减速机中只需获得第一个值&退出。

次要排序详情:Secondary Sort

答案 2 :(得分:0)

在gist上查看以下代码:

https://gist.github.com/meshekhar/6dd773abf2af6ff631054facab885bf3

在mapper中,数据被映射到键值对:

while (letter == 'X' or letter == 'O'):

在reducer中,使用while循环遍历所有记录,每个值都被分成名称和标记以及存储在temp变量中的最大标记。

最后,返回最大值和相应的名称对。例如保罗90。

我在一个记录超过100万条记录的单节点系统上进行了测试,耗时不到10秒。