如何填写mapper?

tvokkenx  于 2021-06-02  发布在  Hadoop
关注(0)|答案(1)|浏览(336)
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} 所有行中都包含“{”和“}”字符。我想在这些字符之间填入上下文。但我越来越 java.lang.StringIndexOutOfBoundsException 在编译过程中。
我该如何更改代码?为什么我会出错?
谢谢。

i86rm4rw

i86rm4rw1#

从您提供的代码中,有两种方法可以获得 java.lang.StringIndexOutOfBoundsException 这个 { 以及 } 在您运行的输入中不平衡。
如果没有 { 以及 } 在中,值未被处理。因为,如果它们不存在于值中 left 以及 right 变量变成 -1 . 因此你得到一个 StringIndexOutOfBoundsException 因此,您应该更改的代码如下:

//......
   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));       
      }
     }
   //..........

相关问题