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



如何按值递减排序reducer输出?我正在开发一个应用程序,它必须返回收听率最高的歌曲。因此,歌曲必须按收听次数排序。我的应用程序是这样工作的:

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

知道怎么做吗?

最好的方法是使用第一个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]输出进行排序。让我知道它是如何工作的!

CL

根据文档,Reducer输出不会重新排序。通过为JobConf.setOutputValueGroupingComparator(Class)设置适当的值,对reducer的输入进行排序(如果适用于您的应用程序),或者在单独的步骤中对reduceer的最终输出进行排序。

相关内容

  • 没有找到相关文章

最新更新