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

irlmq6kh  于 2021-06-02  发布在  Hadoop
关注(0)|答案(3)|浏览(300)

我要用mr找到成绩最好的学生

Paul 90
Ben 20
Cook 80
Joe 85

所以减速机的出力应该是(90)
有人能帮我吗?

vyswwuz2

vyswwuz21#

您可以将所有输入元组Map到同一个键,每个输入元组的值都相同,例如(one key,(ben,20)),并使用reduce函数仅返回具有最大等级的元组(因为只有一个键)。
为了确保mr并行性生效,使用与reducer(上面)具有相同功能的组合器应该可以做到这一点。这样,reducer将只从每个Map器中获得一个元组,并且将有更少的工作要做。
编辑:更好的是,您已经可以消除Map函数中除max以外的所有函数,以获得最佳性能(请参阅venkat的评论,合并器不能保证使用)。
使用两个Map器的示例:

Paul 90
Ben 20
Cook 80
Joe 85

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可能会“太多”。如果只有几百或几千个值,在本地内存中进行简单的扫描会更快。

xzabzqsa

xzabzqsa2#

一个很好的方法是在hadoop中进行二次排序。Map输出键应该是(名称、标记)的组合。
然后您将实现一个定制的比较器,它可以接受这个键&基于标记只比较2个给定的值,并基于更高的标记进行排序。
通常我们实现一个分组比较器,但在这种情况下,我们希望所有的键都进入一个减速机。因此,我们将忽略分组比较器中的关键差异。
在减速机中,只需获取第一个值并退出。
二次分拣详情:二次分拣

2izufjch

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秒。

相关问题