2017-03-18 6 views
1

私はCSVファイルを1行ずつ読み込み、 "India"を含む行のキー値のペアを部分文字列として送信しようとしています。このため私は以下のコードを開発しました。マッパーがArrayIndexoutofboundexceptionをスローするのはなぜですか?

マッパーコード

import java.io.IOException; 

import org.apache.hadoop.io.IntWritable; 
import org.apache.hadoop.io.LongWritable; 
import org.apache.hadoop.io.Text; 
import org.apache.hadoop.mapreduce.Mapper; 


public class MapperCode extends Mapper<LongWritable,Text,Text,IntWritable> { 
    public void map(LongWritable key,Text value,Context context) throws IOException,InterruptedException 
    { 
     String Line=value.toString(); 
     String out=""; 
     String search_line=Line; 
     String splitter[]=Line.split(" "); 
     String searchStr="india"; 
     for(String words:splitter) 
     { 
      if(searchStr.equals(words)) 
      { 
       out=out+"\n"+search_line; 
       System.out.println(out); 
      } 
     } 
     String keyvalpair[]=out.split(","); 
     context.write(new Text(keyvalpair[2].trim()), new IntWritable(Integer.parseInt(keyvalpair[9].trim()))); 
    } 
} 

データセット

Clarissa Chun,30,United States,2012,08-12-2012,Wrestling,0,0,1,1 
Yogeshwar Dutt,29,India,2012,08-12-2012,Wrestling,0,0,1,1 
Jaime Espinal,27,Puerto Rico,2012,08-12-2012,Wrestling,0,1,0,1 
Johan Eurén,27,Sweden,2012,08-12-2012,Wrestling,0,0,1,1 
Karam Gaber,32,Egypt,2012,08-12-2012,Wrestling,0,1,0,1 

例外

17/03/17 21:11:08 INFO mapred.JobClient: Task Id :  attempt_201703140915_0030_m_000000_1, Status : FAILED 
java.lang.ArrayIndexOutOfBoundsException: 2 
     at MapperCode.map(MapperCode.java:26) 
     at MapperCode.map(MapperCode.java:1) 
     at org.apache.hadoop.mapreduce.Mapper.run(Mapper.java:144) 
     at org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:647) 
     at org.apache.hadoop.mapred.MapTask.run(MapTask.java:323) 
     at org.apache.hadoop.mapred.Child$4.run(Child.java:270) 
     at java.security.AccessController.doPrivileged(Native Method) 
     at javax.security.auth.Subject.doAs(Subject.java:396) 
     at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1127) 
     at org.apache.hadoop.mapred.Child.main(Child.java:264) 

私を助けてください。アドバンスありがとう!

答えて

2

単純に、そのサイズではない配列のインデックスにアクセスしようとしているためです。私は小さな痕跡に従ってみましょう。

1- Clarissa Chun,30,United States,2012,08-12-2012,Wrestling,0,0,1,1 
    2- splitter = ["Clarissa", "Chun,30,United", "States,2012,08-12-2012,Wrestling,0,0,1,1] 
    3- keyvalpair = ["Clarissa"] 
    4. keyvalpair[2] ==> ???? 

あなたはそれを取得しましたか?お役に立てれば。その特定の目的のために

、はるかに簡単な何かを試してみてください、あなただけ行う必要があります:

public class MapperCode extends Mapper<LongWritable,Text,Text,IntWritable> { 
    public void map(LongWritable key,Text value,Context context) throws IOException,InterruptedException { 
     String line = value.toString(); 
     if(line.contains("india")) { 
      String keyvalpair[] = line.split(","); 
      context.write(new Text(keyvalpair[2].trim()), new IntWritable(Integer.parseInt(line))); 
     } 
    } 
} 
+0

あなたに同意します。私は "、"の代わりに ""(行を分割するために)しようとしました。再び同じ例外だった。 @dbustosp – user3928562

+0

@ user3928562アップデートを確認してください。 – dbustosp

2

問題はここにあります。

String splitter[]=Line.split(" "); 

あなたは 'あなたが使用することをcouldeこのperticular場合はspace'.In'

String splitter[]=Line.split(","); 

「、使用して分割しようとしているこれは、正常に動作する必要があります。

+0

はい、私はこれもあまりにも運がないとしようとしました。 – user3928562

関連する問題