2017-03-18 6 views
1

줄 단위로 CSV 파일을 읽고 하위 문자열로 "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

문제는 여기에있다. 당신은 'space'.In 당신이 사용을 coulde이 perticular 경우'를 사용하여 분할하려고하는

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

, '

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

이 잘 작동합니다.

+0

그래, 나는 이걸로도 행운을 찾지 못했다. – user3928562