2015-12-05 4 views
0

Im пытается запустить своего рода алгоритм, использующий MapReduce, но всегда я получаю массив из ofBoundМассив OUTOF связан MapReduce

Exception

java.lang.ArrayIndexOutOfBoundsException: 6 
at to.SecSortMapper.map(SecSortMapper.java:17) 
at to.SecSortMapper.map(SecSortMapper.java:1) 

код

if (value.toString().length() > 0) { 
    String arrEmpAttributes[] = value.toString().split("\\t"); 
    context.write(new TextPair(arrEmpAttributes[6].toString(), 
      (arrEmpAttributes[3].toString() + "\t" + arrEmpAttributes[2].toString() + "\t" + arrEmpAttributes[0].toString())), nullWritable.get()); 

} 

Line 17 это новый TextPair (.............)

Я попытался изменить строку строки значений> 1, но он не работает, может кто-нибудь помочь?

+1

Вы также должны создать еще один чек 'если (arrEmpAttributes.length> 0)' потому что вы используете arrEmpAttributes [6] может быть его длина меньше чем 6 –

+0

if (value.toString(). length()> 1) { Строка arrEmpAttributes [] = значение.toString(). split ("\\ t"); //System.out.printf("longeuur est ", arrEmpAttributes.length); context.write ( новые TextPair (arrEmpAttributes [6] .ToString(), (arrEmpAttributes [3] .ToString() + "\ т" + arrEmpAttributes [2] .ToString() + "\ т" + arrEmpAttributes [0] .ToString())), NullWritable.null }} здесь peusdocode я думаю, что его бесполезно, чтобы создать другой, если (aarrEmAttribute> 0} – BigBosss

+0

жаль, если (arrEmpAttributes.length> 6) –

ответ

0

Вы принимаете предположение, что arrEmpAttributes содержит не менее 7 элементов, ни один из которых не является null. Это опасное предположение, особенно в большом мире данных, где вы почти гарантированно имеете дело с некоторыми несоответствиями в ваших входных данных.

Ваше if заявление должно выглядеть следующим образом:

valueStr = value.toString(); //Declare this outside of the loop for efficiency 
if (!StringUtils.isEmpty(valueStr)) { 
    arrEmpAttributes[] = valueStr.split(TAB_SEPARATOR); //Also declare these two outside of the loop 
    if(!ArrayUtils.isEmpty(arrEmpAttributes) && arrEmpAttributes.length==SEVEN) { 
    //context.write... 
    } 
} 
+0

спасибо я изменил код таким образом, и у меня нет больше ошибки, но я получил 7 выходных пустой файл Строка valueStr = value.toString(); (! StringUtils.isEmpty (valueStr)) \t если {
\t \t Струнного arrEmpAttributes [] = valueStr.split ("\\ т");
\t если (! ArrayUtils.isEmpty (arrEmpAttributes) && arrEmpAttributes.length == 7) {
\t \t context.write (
\t \t \t \t новые TextPair (arrEmpAttributes [6] .ToString(),
\t \t \t \t (arrEmpAttributes [3] .ToString() + "\ т"
\t \t \t \t + arrEmpAttributes [2] .ToString() + "\ т" +
arrEmpAttribut es [0] .toString())),
\t \t \t \t NullWritable.get()); \t} \t} \t} – BigBosss

+0

как я могу исправить это, пожалуйста?и как я могу форматировать код, когда пишу здесь – BigBosss

+0

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