7

レデューサーの出力を値の降順で並べ替えるにはどうすればよいですか?よく聴いた曲を返さなければならないアプリケーションを開発しています。したがって、曲はリスニングの数で並べ替える必要があります。私のアプリケーションは次のように機能します。

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

これを行う方法はありますか?

4

2 に答える 2

6

これを行う最良の方法は、最初の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);
   }     
}

これにより、最初のMapReduceの[LongWritable、text]出力がLongWritable値で並べ替えられます。それがどのように機能するか教えてください!

CL

于 2014-06-12T16:13:41.383 に答える
3

ドキュメントによると、Reducerの出力は再ソートされません。JobConf.setOutputValueGroupingComparator(Class)に適切な値を設定して、レデューサーへの入力を並べ替えるか(アプリケーションで機能する場合) 、別の手順でレデューサーからの最終出力を並べ替えます。

于 2012-09-09T22:41:58.657 に答える