oop - Проблема с преобразованием текста в плавающее число - PullRequest
0 голосов
/ 03 марта 2020

У меня есть 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);
    }
  }

Примечание: я заставил редуктор производить вывод картографа без каких-либо изменений, и это дало ожидаемый результат

1 Ответ

0 голосов
/ 03 марта 2020

работает в NumberFormatException, и значение, отображаемое в ошибке, отсутствует даже в моих вводах

Ну, это совершенно невозможно. Где-то значение должно быть в вашем вводе или сгенерированном выводе mapper. Try catch работает в редукторе так же хорошо, как и везде, хотя

FWIW, используйте DoubleWritable

...