如何填写Mapper?

时间:2014-05-19 16:23:26

标签: java hadoop mapper

public void map(LongWritable key, Text value, Context context)
      throws IOException, InterruptedException {   

       String line = value.toString();     
       int left = line.indexOf("{");
       int right = line.indexOf("}");
       String subMyString = line.substring(left+1, right);  

          for (String myWord : subMyString.split("\\W+")) {    
          if (myWord.length() > 0)        
              context.write(new Text(myWord), new IntWritable(1));       
          }
}

在我的mapper.class

我的输入文件:

...

...bla..bla..{asd assda sddsaasd asd}

...bla..bla..{asd assda sddsaasd asd}

...bla..bla..{asd assda sddsaasd asd}

...

当然:line= ...bla..bla..{asd assda sddsaasd asd} 在All line中包括" {"和"}"字符。我想在这些角色之间填写上下文。但我在编译期间得到java.lang.StringIndexOutOfBoundsException

我应该如何更改我的代码?为什么我会收到错误?

感谢。

1 个答案:

答案 0 :(得分:0)

根据您提供的代码,有两种方法可以获得java.lang.StringIndexOutOfBoundsException

  1. {}在您正在投放的输入中不平衡。
  2. 未处理值中没有{}的情况。因为,如果值不存在,则leftright变量将变为-1。因此,您获得StringIndexOutOfBoundsException
  3. 所以,您应该更改的代码是这样的:

      //......
       int left = line.indexOf("{");
       int right = line.indexOf("}");
    
        if(left > 0 && right > 0){
          String subMyString = line.substring(left+1, right);  
          for (String myWord : subMyString.split("\\W+")) {    
          if (myWord.length() > 0)        
              context.write(new Text(myWord), new IntWritable(1));       
          }
         }
       //..........