2017-02-12 25 views
1

Im пытается разбить записи на слова, основанные на не буквенно-цифровых символах, считать первую букву в каждом слове и получить общее появление первого алфавита в каждом слове. Ниже приведена логика класса Mapper, которую я пытался выполнить.StringIndexOutOfBoundsException в моем коде MapReduce

public void map(LongWritable key, Text value, Context ctx) { 
    String line = value.toString(); 
    String[] split = line.split("\\W+"); 
    String firstChar; 
    for(String words: split) { 
     firstChar = String.valueOf(words.charAt(0)); 
     try { 
      ctx.write(new Text(firstChar), new IntWritable(1)); 
     } catch (IOException | InterruptedException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

Исключение:

Error: java.lang.StringIndexOutOfBoundsException: String index out of range: 0 
    at java.lang.String.charAt(String.java:658) 
    at com.hadoopexp.mapper.MapperClass.map(MapperClass.java:17) 
    at com.hadoopexp.mapper.MapperClass.map(MapperClass.java:1) 

Но Im получение StringIndexOutOfBounds исключение для этой логики на линии:

firstChar = String.valueOf(words.charAt(0)); 

Я поставил несколько пустых строк в файле ввода только чтобы увидеть, если он работает. (например, ниже)

Liverpool 
Manchester 


London 

Toronto ? ?? !!12 32 

Может ли кто-нибудь помочь мне в том, как исправить логику. Любая помощь действительно ценится.

ответ

0

Разделение пустой строки возвращает массив, содержащий один элемент пустой строки. Я бы просто уточнил его явно:

for(String words: split) { 
    if (!words.isEmpty()) { // Here! 
     firstChar = String.valueOf(words.charAt(0)); 
     try { 
      ctx.write(new Text(firstChar), new IntWritable(1)); 
     } catch (IOException | InterruptedException e) { 
      e.printStackTrace(); 
     } 
    } 
} 
+0

Большое спасибо Mureinik. Это работает. – Sidhartha

Смежные вопросы