Невозможно найти причину исключения исключения индекса строки в моем коде MapReduce - PullRequest
0 голосов
/ 28 ноября 2018

Я пробую код MapReduce, написанный на Java.Мне нужно узнать количество сотрудников, которые были повышены в каждом отделе, но все же покинули организацию.Я пытаюсь передать связанное значение отдела и продвижения по службе в качестве ключа, а отставку - в качестве значения.

Образцы данных

left сдвиг_движения_5_лет

1, 0, продажа

1, 1, продажа

1, 1, час

1, 0, продажа

Код Mapper:

public void map(LongWritable key, Text text, Context context) throws IOException, InterruptedException
 {
     String row = text.toString();
        String [] values = row.trim().split(",");
        int left = 0;
        int promotion = 0;
        String dept = "";
        String DeptPromoted = "";
        try
        {
            if(values.length == 10 && !header.equals(row))
            {
                left = Integer.parseInt(values[6]);
                promotion = Integer.parseInt(values[7]);
                dept = values[8];
                DeptPromoted = dept+"-"+values[7];  //  sales-0                 
            }
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
        context.write(new Text(DeptPromoted), new IntWritable(left)); //sales-0 1
    }

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

Код редуктора:

public void reduce(Text key, Iterable<IntWritable> values, Context context throws IOException, InterruptedException
{
    //sales-0   1
    int count = 0;
    String str = "";
    str = key.toString();   //sales-0
    int len = str.length(); //7
    char L = str.charAt(len - 1);
    if (L == '1')
    {
        for (IntWritable val: values)
        {
            if(val.get() == 1)
            {
                count++;
            }
        }
    }
    context.write(key, new IntWritable(count));
}

Я считаю, что исключение StringIndexOutofBoundException происходит из редуктора, в котором я пытаюсь получить значение символа в конце строки.Может кто-нибудь помочь устранить ошибку ниже?

Error: java.lang.StringIndexOutOfBoundsException: String index out of range: -1
at java.lang.String.charAt(String.java:658)
at com.df.hra_promleft.PromLeftReducer.reduce(PromLeftReducer.java:18)
at com.df.hra_promleft.PromLeftReducer.reduce(PromLeftReducer.java:1)
at org.apache.hadoop.mapreduce.Reducer.run(Reducer.java:171)
at org.apache.hadoop.mapred.ReduceTask.runNewReducer(ReduceTask.java:627)
at org.apache.hadoop.mapred.ReduceTask.run(ReduceTask.java:389)
at org.apache.hadoop.mapred.YarnChild$2.run(YarnChild.java:168)
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:1642)
at org.apache.hadoop.mapred.YarnChild.main(YarnChild.java:163)

Ответы [ 2 ]

0 голосов
/ 30 ноября 2018
String str = "";
str = key.toString();   //sales-0    
int len = str.length(); //7   
char L = str.charAt(len - 1);

Если ключ - пустой текст, то len = 0 , поэтому str.charAt (0-1) равно str.charAt(-1) это вызывает исключение StringIndexOutOfBoundsException.Поэтому, пожалуйста, проверьте, является ли текстовая клавиша пустой или нет.

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

Исключение IndexOutOfBoundException возможно из-за кода: -

char L = str.charAt(len - 1);

Вот причина: -

Ваши данные включают в себя: - 1 0 продаж, и ваш код разбивает данные наоснование "," (запятая): -

String row = text.toString();
String [] values = row.trim().split(",");

Учитывая, что вы используете обычный TextInputFormat.Ваши значения всегда будут иметь только одну запись.

В этом сценарии ключ к редуктору всегда будет пустым, т. е. ""

, поэтому при вызове

int len = str.length(); //7
char L = str.charAt(len - 1);

следует броситьStringIndexOutOfBoundsException.

пример кода: -

String s = ""
int length = s.length()
Character c = s.charAt(length - 1)

Я предлагаю внести соответствующие изменения в ваш код и добавить необходимые проверки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...