Я работаю над проблемой уменьшения карты. Мои выходные данные функции карты (... Text, MapWritable) и входные данные моего редуктора (Text, MapWritable ...)
MapWritable содержит два значения, цель и вес, определяемые следующим образом:
mappW.put(new Text("tgt"), new IntWritable(Integer.parseInt(data[1])));
mappW.put(new Text("weight"), new IntWritable(Integer.parseInt(data[2])));
context.write(textKey, mapperW);
Моя проблема связана с доступом к данным в функции редуктора. Я получаю сообщение об ошибке:
org.apache.hadoop.io.Writable cannot be converted to java.lang.Integer
Эту ошибку трудно отладить, поскольку я не смог найти ничего, связанного с записываемыми файлами, преобразуемыми в int.
Любая помощь в правильном направлениибыло бы замечательно. Приведенный ниже код описывает, как я реализую MapWritable в функции карты и код редуктора.
public static class WeightReducer
extend Reducer<Text, MapWritable, Text, Text> {
public void reduce(Text key, Iterable<MapWritable> values, Context context
) throws IOException, InterruptedException {
int maxTgt;
maxTgt = 0;
int maxWeight;
maxWeight = 0;
for (MapWritable value : values) {
int curr_tgt = value.get(new Text("tgt"));
int curr_weight = value.get(new Text("weight"));
if (curr_weight > maxWeight) {
/* store this data into maxWeight and maxTgt */
} else if (curr_weight.equals(maxWeight) && curr_tgt < maxTgt) {
/* update maxWeight and maxTgt */
}
/*convert maxTgt and maxWeight to strings, concatenate them and write */
String tgtString = Integer.toString(maxTgt);
String tgtWeight = Integer.toString(maxWeight);
String output = tgtString + ", " + tgtWeight;
Text outText = new Text(output);
context.write(key, outText);
}
}
}