Я пытаюсь написать простую программу Map Reduce с использованием Hadoop, которая даст мне месяц, наиболее подверженный гриппу.Я использую набор данных трендов Google Flu, который можно найти здесь http://www.google.org/flutrends/data.txt.
Я написал и Mapper и редуктор, как показано ниже
public class MaxFluPerMonthMapper extends Mapper<LongWritable, Text, IntWritable, IntWritable> {
private static final Log LOG =
LogFactory.getLog(MaxFluPerMonthMapper.class);
@Override
protected void map(LongWritable key, Text value, Context context)
throws IOException, InterruptedException {
String row = value.toString();
LOG.debug("Received row " + row);
List<String> columns = Arrays.asList(row.split(","));
String date = columns.get(0);
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
int month = 0;
try {
Calendar calendar = Calendar.getInstance();
calendar.setTime(sdf.parse(date));
month = calendar.get(Calendar.MONTH);
} catch (ParseException e) {
e.printStackTrace();
}
for (int i = 1; i < columns.size(); i++) {
String fluIndex = columns.get(i);
if (StringUtils.isNotBlank(fluIndex) && StringUtils.isNumeric(fluIndex)) {
LOG.info("Writing key " + month + " and value " + fluIndex);
context.write(new IntWritable(month), new IntWritable(Integer.valueOf(fluIndex)));
}
}
}
}
Редуктор
public class MaxFluPerMonthReducer extends Reducer<IntWritable, IntWritable, Text, IntWritable> {
private static final Log LOG =
LogFactory.getLog(MaxFluPerMonthReducer.class);
@Override
protected void reduce(IntWritable key, Iterable<IntWritable> values, Context context)
throws IOException, InterruptedException {
LOG.info("Received key " + key.get());
int sum = 0;
for (IntWritable intWritable : values) {
sum += intWritable.get();
}
int month = key.get();
String monthString = new DateFormatSymbols().getMonths()[month];
context.write(new Text(monthString), new IntWritable(sum));
}
}
С помощью этих картографов и редукторов, показанных выше, я получаю следующий вывод
январь 545419 февраль 528022 март 436348 апрель 336759 май 346482 июнь309795 июль 312966 август 307346 сентябрь 322359 октябрь 428346 ноябрь 461195 декабрь 480078
То, что я хочу, - это всего лишь один вывод, дающий мне января 545419 Как мне этого добиться?путем сохранения состояния в редукторе или есть какое-то другое решение?или мой маппер и редуктор неверны для вопроса, который я задаю в этом наборе данных?