我要用mr找到成绩最好的学生
Paul 90 Ben 20 Cook 80 Joe 85
所以减速机的出力应该是(90)有人能帮我吗?
vyswwuz21#
您可以将所有输入元组Map到同一个键,每个输入元组的值都相同,例如(one key,(ben,20)),并使用reduce函数仅返回具有最大等级的元组(因为只有一个键)。为了确保mr并行性生效,使用与reducer(上面)具有相同功能的组合器应该可以做到这一点。这样,reducer将只从每个Map器中获得一个元组,并且将有更少的工作要做。编辑:更好的是,您已经可以消除Map函数中除max以外的所有函数,以获得最佳性能(请参阅venkat的评论,合并器不能保证使用)。使用两个Map器的示例:
Map到:
Mapper 1 (the-one-key, (Paul, 90)) (the-one-key, (Ben, 20)) Mapper 2 (the-one-key, (Cook, 80)) (the-one-key, (Joe, 85))
合并到(仍在Map绘制者一侧):
Mapper 1 (the-one-key, (Paul, 90)) Mapper 2 (the-one-key, (Joe, 85))
减少到:
(the-one-key, (Paul, 90))
最后一句话:如果数据集很小,mapreduce可能会“太多”。如果只有几百或几千个值,在本地内存中进行简单的扫描会更快。
xzabzqsa2#
一个很好的方法是在hadoop中进行二次排序。Map输出键应该是(名称、标记)的组合。然后您将实现一个定制的比较器,它可以接受这个键&基于标记只比较2个给定的值,并基于更高的标记进行排序。通常我们实现一个分组比较器,但在这种情况下,我们希望所有的键都进入一个减速机。因此,我们将忽略分组比较器中的关键差异。在减速机中,只需获取第一个值并退出。二次分拣详情:二次分拣
2izufjch3#
请看下面的代码:https://gist.github.com/meshekhar/6dd773abf2af6ff631054facab885bf3在mapper中,数据被Map到键值对:
key: "Paul 90" key: "Ben 20" key: "Cook 80" key: "Joe 85"
在reducer中,使用while循环遍历所有记录,每个值被拆分为name和marks以及存储在temp变量中的max marks。最后,返回最大值和对应的名称对。e、 保罗90。我在一个有100多万条记录的单节点系统上进行了测试,耗时不到10秒。
3条答案
按热度按时间vyswwuz21#
您可以将所有输入元组Map到同一个键,每个输入元组的值都相同,例如(one key,(ben,20)),并使用reduce函数仅返回具有最大等级的元组(因为只有一个键)。
为了确保mr并行性生效,使用与reducer(上面)具有相同功能的组合器应该可以做到这一点。这样,reducer将只从每个Map器中获得一个元组,并且将有更少的工作要做。
编辑:更好的是,您已经可以消除Map函数中除max以外的所有函数,以获得最佳性能(请参阅venkat的评论,合并器不能保证使用)。
使用两个Map器的示例:
Map到:
合并到(仍在Map绘制者一侧):
减少到:
最后一句话:如果数据集很小,mapreduce可能会“太多”。如果只有几百或几千个值,在本地内存中进行简单的扫描会更快。
xzabzqsa2#
一个很好的方法是在hadoop中进行二次排序。Map输出键应该是(名称、标记)的组合。
然后您将实现一个定制的比较器,它可以接受这个键&基于标记只比较2个给定的值,并基于更高的标记进行排序。
通常我们实现一个分组比较器,但在这种情况下,我们希望所有的键都进入一个减速机。因此,我们将忽略分组比较器中的关键差异。
在减速机中,只需获取第一个值并退出。
二次分拣详情:二次分拣
2izufjch3#
请看下面的代码:
https://gist.github.com/meshekhar/6dd773abf2af6ff631054facab885bf3
在mapper中,数据被Map到键值对:
在reducer中,使用while循环遍历所有记录,每个值被拆分为name和marks以及存储在temp变量中的max marks。
最后,返回最大值和对应的名称对。e、 保罗90。
我在一个有100多万条记录的单节点系统上进行了测试,耗时不到10秒。