使用mapreduce为每个值的top-N b值

时间:2013-12-29 20:05:59

标签: hadoop mapreduce

我是hadoop的新手,并且一直在努力编写mapreduce算法来查找每个A值的前N值。任何有关代码实现的帮助或指南都将受到高度赞赏。

Input data
a,1
a,9
b,3
b,5
a,4
a,7
b,1

output
a 1,4,7,9
b 1,3,5

我相信我们应该编写一个Mapper来读取该行,拆分值并允许它由reducer收集。一旦进入减速器,我们就必须进行分选。

2 个答案:

答案 0 :(得分:3)

如果每个键的值的数量足够小,只需让reducer读取与给定键相关的所有值并输出前N的简单方法可能是最好的。

如果每个键的值的数量足够大,这将是一个糟糕的选择,那么复合键将更好地工作,并且将需要自定义分区器和比较器。你想要根据自然键进行分区(这里'a'或'b',这样它们最终会在同一个reducer上),但是对值进行二次排序(这样减速器会首先看到最大的值) )。

答案 1 :(得分:2)

cohoz提到的次要排序技巧似乎是你正在寻找的。

有一个很好的指南here,它甚至具有与你的问题相似的结构(在这个例子中,作者试图按照每个类的排序顺序遍历每个整数时间戳(1,2,3) (a,b,c)。你只需要修改示例中的reducer,只需遍历前n个项目然后发出它们,然后停止。