我是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
我认为我们应该编写一个Map器来读取行,拆分值并允许reducer收集它。一旦进入减速机,我们就要进行分类。
c9qzyr3d1#
如果每个键的值数足够小,那么让reducer读取与给定键相关联的所有值并输出前n个值的简单方法可能是最好的。如果每个键的值数足够大,这将是一个糟糕的选择,那么复合键将工作得更好,并且需要一个自定义的分区器和比较器。您可能希望基于自然键(这里是'a'或'b',以便它们最终位于同一个reducer)进行分区,但对值进行二次排序(以便reducer首先看到最大的值)。
qybjjes12#
科霍兹提到的第二种排序技巧似乎就是你要找的。这里有一个很好的指南,它甚至有一个与您的问题相似的结构(在这个示例中,作者试图按照每个类(a,b,c)的排序顺序遍历每个整数时间戳(1,2,3)。您只需修改示例中的reducer,使其仅遍历前n个项并发射它们,然后停止。
2条答案
按热度按时间c9qzyr3d1#
如果每个键的值数足够小,那么让reducer读取与给定键相关联的所有值并输出前n个值的简单方法可能是最好的。
如果每个键的值数足够大,这将是一个糟糕的选择,那么复合键将工作得更好,并且需要一个自定义的分区器和比较器。您可能希望基于自然键(这里是'a'或'b',以便它们最终位于同一个reducer)进行分区,但对值进行二次排序(以便reducer首先看到最大的值)。
qybjjes12#
科霍兹提到的第二种排序技巧似乎就是你要找的。
这里有一个很好的指南,它甚至有一个与您的问题相似的结构(在这个示例中,作者试图按照每个类(a,b,c)的排序顺序遍历每个整数时间戳(1,2,3)。您只需修改示例中的reducer,使其仅遍历前n个项并发射它们,然后停止。