私は Hadoop を初めて使用し、 Java でいくつかの map/reduce タスクを実行しようとしています。すべてのキーと値のペアに対してどのように削減操作を実行できるか疑問に思っていました。
たとえば、月の各日について、この日の最高気温があるとします。日をキー、気温を値として取り、その月の最高気温のキー/値を取得したいと考えています。
私の質問が明確であることを願っています!
ご協力ありがとうございました。
私は Hadoop を初めて使用し、 Java でいくつかの map/reduce タスクを実行しようとしています。すべてのキーと値のペアに対してどのように削減操作を実行できるか疑問に思っていました。
たとえば、月の各日について、この日の最高気温があるとします。日をキー、気温を値として取り、その月の最高気温のキー/値を取得したいと考えています。
私の質問が明確であることを願っています!
ご協力ありがとうございました。
はい、可能です。job.setNumReduceTasks(1)を介して単一のレデューサーを使用するようにジョブを構成するだけです。この単一のレデューサーは、すべてのキーと値のペアを反復処理します。reduce()
メソッドでは最大値を検索するだけで、メソッドでcleanup()
は最終結果を出力します。例(k, v) = (year, temperature)
:
public class MaxTemperatureReducer extends Reducer<IntWritable, DoubleWritable, IntWritable, DoubleWritable> {
private static int year = 0;
private static double maxTemp = 0.0;
@Override
public void reduce(IntWritable key, Iterable<DoubleWritable> values, Context context) throws IOException, InterruptedException {
for (DoubleWritable value : values) {
if (value.get() > maxTemp) {
year = key.get();
maxTemp = value.get();
}
}
}
@Override
public void cleanup(Context context) throws IOException, InterruptedException {
context.write(new IntWritable(year), new DoubleWritable(maxTemp));
}
}
簡単な方法は、単に任意のキー (「月」) を使用し、値に気温と日の両方を含めることです。次に、reduce メソッドで、気温の最高値を見つけて、日と気温の両方を返します。