Я пробую код 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)