2017-02-12 3 views
1

Im Versuch, die Datensätze in Wörter basierend auf nicht-alphanumerischen Zeichen zu brechen, zählen Sie den ersten Buchstaben in jedem Wort und erhalten das Gesamtvorkommen des ersten Alphabets in jedem Wort. Unten ist die Mapper-Klassenlogik, die ich auszuführen versuchte.StringIndexOutOfBoundsException in meinem MapReduce-Code

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(); 
     } 
    } 
} 

Ausnahme:

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) 

Aber Im StringIndexOutOfBounds Ausnahme für diese Logik auf der Linie erhalten:

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

ich einige leere Zeilen in der Eingabedatei nur, wenn sie gesetzt haben, um zu sehen funktioniert. (wie unten)

Kann jemand mir helfen, wie man die Logik repariert. Jede Hilfe wird wirklich geschätzt.

Antwort

0

Teilen einer leeren Zeichenfolge gibt ein Array zurück, das ein einzelnes Element einer leeren Zeichenfolge enthält. Ich würde es nur explizit überprüfen:

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

Vielen Dank Mureinik. Es funktioniert. – Sidhartha

Verwandte Themen