Я сейчас немного борюсь с MapReduce.У меня есть следующий набор данных:
1,John,Computer
2,Anne,Computer
3,John,Mobile
4,Julia,Mobile
5,Jack,Mobile
6,Jack,TV
7,John,Computer
8,Jack,TV
9,Jack,TV
10,Anne,Mobile
11,Anne,Computer
12,Julia,Mobile
Теперь я хочу применить MapReduce с группировкой и агрегацией для этого набора данных, чтобы выходные данные не только показывали, сколько раз кто-то что-то купил, но ичто это за продукт, который заказал человек больше всего.
Таким образом, результат должен выглядеть следующим образом:
John 3 Computer
Anne 3 Mobile
Jack 4 TV
Julia 2 Mobile
Моя текущая реализация маппера, а также редуктора выглядит так, что прекрасно возвращаетсколько заказов было сделано отдельными лицами, однако я действительно не знаю, как получить желаемый результат.
static class CountMatchesMapper extends Mapper<Object,Text,Text,IntWritable> {
@Override
protected void map(Object key, Text value, Context ctx) throws IOException, InterruptedException {
String row = value.toString();
String[] row_part = row.split(",");
try{
ctx.write(new Text(row_part[1]), new IntWritable(1));
catch (IOException e) {
}
catch (InterruptedException e) {
}
}
}
}
static class CountMatchesReducer extends Reducer<Text,IntWritable,Text,IntWritable> {
@Override
protected void reduce(Text key, Iterable<IntWritable> values, Context ctx) throws IOException, InterruptedException {
int i = 0;
for (IntWritable value : values) i += value.get();
try{
ctx.write(key, new IntWritable(i));
}
catch (IOException e) {
}
catch (InterruptedException e) {
}
}
}
Я был бы очень признателен за любое эффективное решение и помощь.
Заранее спасибо!