Вы хотите получить продукт с максимальным количеством по городу . Как я понимаю, вы хотите, чтобы в каждом городе был продукт, с максимальными продажами в этом конкретном городе, не так ли?
Я бы предпочел сделать это в 2 парах M-R. Первая пара похожа на вашу:
public void map(Object key, Text value, Context context) {
String[] linha = value.toString().split(";");
cidadeproduto.set(linha[2] + "&" + linha[3]);
context.write(cidadeproduto, new IntWritable(1));
}
public void reduce(Text key, Iterable<IntWritable> values, Context context){
int contValue = 0;
for (IntWritable value : values) {
contValue += value.get();
}
context.write(key, new IntWritable(contValue));
}
И вторая пара.
Картограф будет перегруппировать ваши данные так, чтобы город был ключевым, а product & count - значением:
public void map(Object key, Text value, Context context) {
String[] row = value.toString().split(";");
String city = row[0].split("&")[0];
String product = row[0].split("&")[1];
String count = row[1];
context.write(new Text(city), new Text(product + "&" + count));
}
И затем уменьшение будет поддерживать максимальное значение для каждого города:
public void reduce(Text key, Iterable<Text> values, Context context){
int maxVal = Integer.MIN_VALUE;
String maxProd = "None";
for (IntWritable value : values) {
String ss = value.toString().split("&");
int cnt = Integer.parseInt(ss[1]);
if(cnt > maxVal){
maxVal = cnt;
maxProd = ss[0];
}
}
context.write(key, new Text(maxProd));
}