Ошибка: java.lang.NumberFormatException: для входной строки: «время» - PullRequest
0 голосов
/ 25 ноября 2018

Я пытаюсь написать код Java MapReduce и продолжаю получать сообщение об ошибке:

Error: java.lang.NumberFormatException: For input string: "time"
at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
at java.lang.Long.parseLong(Long.java:589)
at java.lang.Long.parseLong(Long.java:631)
at TokenizerMapper.map(Unknown Source)
at TokenizerMapper.map(Unknown Source)
at org.apache.hadoop.mapreduce.Mapper.run(Mapper.java:145)
at org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:793)
at org.apache.hadoop.mapred.MapTask.run(MapTask.java:341)
at org.apache.hadoop.mapred.YarnChild$2.run(YarnChild.java:164)
at java.security.AccessController.doPrivileged(Native Method)
at javax.security.auth.Subject.doAs(Subject.java:422)
at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1917)
at org.apache.hadoop.mapred.YarnChild.main(YarnChild.java:158)

Код карты, о котором идет речь, выглядит следующим образом:

    public class TokenizerMapper extends Mapper<Object, Text, Text, IntWritable> {
    private final IntWritable one = new IntWritable(1);
    private Text data = new Text();
    String[] transactionData = new String[5];

    public void map(Object key, Text value, Context context) throws IOException, InterruptedException {


        StringTokenizer itr = new StringTokenizer(value.toString(), ",");


        while (itr.hasMoreTokens()) {

            for (int i = 0; i < 5; i++) {
                transactionData[i] = itr.nextToken();
            }


            Long timestamp = Long.parseLong(transactionData[2]);
            Instant instant = Instant.ofEpochSecond(timestamp);
            LocalDateTime ldt = LocalDateTime.ofInstant(instant, ZoneId.of("GMT"));
            int year = ldt.getYear(); //e.g 2009
            Month month = ldt.getMonth(); //e.g JANUARY

            String time = month.toString() + ":" + Integer.toString(year);

            data.set(time);

            context.write(data, one);
        }
    }
}

Предполагается, что он принимает 3-е значениев каждой строке набора данных CSV, который представляет собой число, преобразуйте его в строку, преобразуйте в длинную и используйте длинную, чтобы найти месяц и год.

где я иду не так?спасибо.

edit // Пример записи:

0e3e2357e806b6cdb1f70b54c3a3a17b6714ee1f0e68bebb44a74b1efd512098,00000000839a8e6886ab5951d76f411475428afc90947ee320161bbf18eb6048,1231469665,1,1

1 Ответ

0 голосов
/ 25 ноября 2018

Если проблема в заголовке, просто замените строку, которая вызывает проблему:

Long timestamp = Long.parseLong(transactionData[2]);

на

Long timestamp = 0L;
try {
    timestamp = Long.parseLong(transactionData[2]);
} catch (NumberFormatException e) {
    return;
}

Так что, если значение недопустимо, метод завершится без сбоя.

...