レデューサーの出力を値の降順で並べ替えるにはどうすればよいですか?よく聴いた曲を返さなければならないアプリケーションを開発しています。したがって、曲はリスニングの数で並べ替える必要があります。私のアプリケーションは次のように機能します。
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);
}
}
これにより、最初のMapReduceの[LongWritable、text]出力がLongWritable値で並べ替えられます。それがどのように機能するか教えてください!
CL
ドキュメントによると、Reducerの出力は再ソートされません。JobConf.setOutputValueGroupingComparator(Class)に適切な値を設定して、レデューサーへの入力を並べ替えるか(アプリケーションで機能する場合) 、別の手順でレデューサーからの最終出力を並べ替えます。