У меня есть CSV-файл, содержащий пары ключ-значение; он может иметь несколько записей для одного и того же ключа. Я пишу программу mapreduce для агрегирования этих данных - для каждого ключа предполагается, что он должен давать частоту ключа и сумму значений для ключа.
Мой картограф читает файл csv и выдает ключ и значение как текстовый тип, даже если они числовые c (делаю так, потому что у меня возникают проблемы с использованием FloatWritable для значения).
В редукторе, когда я пытаюсь преобразовать текстовое значение в плавающее, я запускаю NumberFormatException, и значение, показанное в ошибке, отсутствует даже в моих входных данных.
Вот мой код:
public static class AggReducer
extends Reducer<Text,Text,Text,Text> {
private Text result = new Text();
public void reduce(Text key, Iterable<FloatWritable> values,
Context context
) throws IOException, InterruptedException {
int numTrips = 0;
int totalFare = 0;
for (Text val : values) {
totalFare += Float.parseFloat(val.toString());
numTrips++;
}
String resultStr = String.format("%1s,%2s", numTrips, totalFare);
result.set(resultStr);
context.write(key, result);
}
}
Примечание: я заставил редуктор производить вывод картографа без каких-либо изменений, и это дало ожидаемый результат