Ошибка: java.lang.NumberFormatException: код уменьшения карты пустой строки

Вот мой код класса картографа:

package airlinedataanalysis;

import java.io.IOException;

import org.apache.hadoop.io.*;
import org.apache.hadoop.mapreduce.Mapper;

public class AirlineMapperClass extends Mapper<LongWritable, Text, Text, FloatWritable>
{
     public void map(LongWritable key, Text PassengerDetails, Context con)throws IOException, InterruptedException
     {
              String[] detail = PassengerDetails.toString().split(",");
              Integer survived=Integer.parseInt(detail[1]);
              if(survived==1)
              {
                  String sex = detail[4];

                  if(detail[5]==null)
                  { 
                      con.write(new Text(sex), new FloatWritable((float) 0));
                  }         
                  else
                  {   
                    Float age=Float.parseFloat(detail[5]);
                    con.write(new Text(sex), new FloatWritable(age));

                  }



              }

     }

}

Вот ошибка

ошибка

Мой код отлично работает, когда в наборах ввода данных нет пустых значений. Но это не работает, когда входные наборы содержат пустые значения.

Файлы ввода данных выглядят так:

1,0,3,"Braund Mr. Owen Harris",male,22,1,0,A/5 21171,7.25,,S,
2,1,1,"Cumings Mrs. John Bradley (Florence Briggs Thayer)",female,38,1,0,PC 17599,71.2833,C85,C,
3,1,3,"Heikkinen Miss. Laina",female,26,0,0,STON/O2. 3101282,7.925,,S,
4,1,1,"Futrelle Mrs. Jacques Heath (Lily May Peel)",female,35,1,0,113803,53.1,C123,S,
5,0,3,"Allen Mr. William Henry",male,35,0,0,373450,8.05,,S,
6,0,3,"Moran Mr. James",male,,0,0,330877,8.4583,,Q,
7,0,1,"McCarthy Mr. Timothy J",male,54,0,0,17463,51.8625,E46,S,
8,0,3,"Palsson Master. Gosta Leonard",male,2,3,1,349909,21.075,,S,
9,1,3,"Johnson Mrs. Oscar W (Elisabeth Vilhelmina Berg)",female,27,0,2,347742,11.1333,,S,
10,1,2,"Nasser Mrs. Nicholas (Adele Achem)",female,14,1,0,237736,30.0708,,C,
11,1,3,"Sandstrom Miss. Marguerite Rut",female,4,1,1,PP 9549,16.7,G6,S,

Желаемый результат, который я хотел бы:

female  Total Died: 9 :: Average Age:30.222221
male    Total Died: 2 :: Average Age:31.0

Мой код класса редуктора:

package airlinedataanalysis;

import java.io.IOException;

import org.apache.hadoop.io.*;
import org.apache.hadoop.mapreduce.Reducer;

public class AirlineReducer extends Reducer<Text, FloatWritable, Text, Text> 
{
    public void reduce(Text key, Iterable<FloatWritable> value,Context con) throws IOException, InterruptedException
    {
               Float totalage =(float) 0;
               int count = 0;
               for (FloatWritable var : value) 
               {
                totalage += var.get();
                count++;
               }
               float avg =(totalage / count);
               String out = "Total Died: " + count + " :: " + "Average Age:" + avg;
               con.write(key, new Text(out));
    }          
}

person Sanjeev Jangra    schedule 26.06.2017    source источник
comment
Ну, во-первых, ваша вторая строка будет оцениваться как survived, а detail[5](38) не будет Float. У вас будет много проблем.   -  person jiveturkey    schedule 26.06.2017
comment
Но он отлично работает для непустых значений   -  person Sanjeev Jangra    schedule 27.06.2017
comment
Он прямо говорит вам, где он находится, java.lang.Float.parseFloat(Float.java:452). Иди проверь строку 452.   -  person jiveturkey    schedule 27.06.2017
comment
Если бы я знал, как справиться с этой ошибкой сам, я бы не обратился за помощью   -  person Sanjeev Jangra    schedule 27.06.2017
comment
Взгляните на этот принятый ответ. stackoverflow.com/questions/31642352/. Чтобы иметь возможность принимать либо числа с плавающей запятой, либо интегралы, вы можете использовать их как двойники.   -  person jiveturkey    schedule 27.06.2017
comment
Хорошо, я собираюсь разобрать это как двойное, но я не думаю, что это сработает.   -  person Sanjeev Jangra    schedule 27.06.2017
comment
Не работал дружище   -  person Sanjeev Jangra    schedule 27.06.2017
comment
Сэр, желаемый результат был получен при запуске моей программы, но в то время я принимал только те входные данные, в которых значение возраста не отсутствует, и код работает нормально, поэтому я не думаю, что есть какие-либо проблемы с анализом значений. Проблема возникает в том случае, если входной файл содержит реквизиты, в которых не указан возраст для нескольких пассажиров. И возраст указан после пола во входном файле   -  person Sanjeev Jangra    schedule 27.06.2017


Ответы (1)


Вы можете обрабатывать пустые условия String/Null в своем классе картографа, как показано ниже:

public void map(Object key, Text PassengerDetails, Context con)
            throws IOException, InterruptedException {

        String[] detail = PassengerDetails.toString().split(",");

        if (!detail[1].isEmpty() && !detail[1].equals(null)) {

            Integer survived = Integer.parseInt(detail[1]);

            if (survived != null && survived == 1) {

                String sex = "Undefined";

                if (!detail[4].equals(null)) {
                    sex = detail[4];
                }

                if (detail[5].isEmpty() || detail[5] == null) {
                    con.write(new Text(sex), new FloatWritable((int) 0));
                } else {
                    float age = Float.parseFloat(detail[5]);
                    con.write(new Text(sex), new FloatWritable(age));

                }

            }
        }
    }

Это сработает.

person Neeraj    schedule 13.08.2017