mapreduce-如何按值排序减少输出

s1ag04yj  于 2021-06-03  发布在  Hadoop
关注(0)|答案(2)|浏览(509)

如何按值降序排序减速机输出?我正在开发一个必须返回顶级歌曲的应用程序。因此,歌曲必须按听的次数排序。我的应用程序是这样工作的:

Input: songname@userid@boolean
MapOutput : songname userid
ReduceOutput : songname number_of_listening

你知道怎么做吗?

vyswwuz2

vyswwuz21#

根据文档,减速机输出不会重新排序。通过为jobconf.setoutputvaluegroupingcomparator(类)设置适当的值,对reducer的输入进行排序(如果这对应用程序有效),或者只在单独的步骤中对reducer的最终输出进行排序。

ruoxqz4g

ruoxqz4g2#

最好的方法是使用第一个mapreduce作业的输出作为另一个作业的输入,我称之为sort.java。由于hadoop map函数有一个排序算法,您甚至不需要reduce类。就这样做吧:

public static class Map extends Mapper<LongWritable,Text,IntWritable,Text>{
   private Text word = new Text();
   public void map(LongWritable key, Text value, Context context) throws IO Exception, Interrupted Exception{
   String line = value.toString();
   StringTokenizer tokenizer = new StringTokenizer(line);
   word.set(tokenizer.nextToken());
   IntWritable number = new IntWritable(Integer.parseInt(tokenizer.nextToken()));
   context.write(number,word);
   }     
}

这将根据longwritable值对第一个mapreduce的[longwritable,text]输出进行排序。让我知道它是怎么工作的!

相关问题