package nyse.topthreestocksbyvolume; import java.io.IOException; import org.apache.hadoop.io.NullWritable; import org.apache.hadoop.io.Text; import org.apache.hadoop.mapreduce.Reducer; import org.apache.hadoop.mapreduce.lib.output.MultipleOutputs; import nyse.keyvalues.LongPairPrimitive; public class TopThreeStocksByVolumePerDayReducer extends Reducer<LongPairPrimitive, Text, NullWritable, Text> { public enum NOTRADEDAYS { NOTRADE } private MultipleOutputs<NullWritable, Text> multipleOutputs; protected void setup(Context context) throws IOException, InterruptedException { multipleOutputs = new MultipleOutputs<NullWritable, Text>(context); } public void reduce(LongPairPrimitive inputKey, Iterable<Text> records, Context context) throws IOException, InterruptedException { int cnt = 0; for (Text record : records) { if (inputKey.getSecond() == 0) { context.getCounter(NOTRADEDAYS.NOTRADE).increment(1); break; } if (cnt <= 2) { String basePath = String.format("trademonth=%s/part", new Long(inputKey.getFirst()).toString().substring(0, 6)); multipleOutputs.write(NullWritable.get(), record, basePath); } else break; cnt++; } } protected void cleanup(Context context) throws IOException, InterruptedException { multipleOutputs.close(); } }