2014-05-12 111 views
0

我把hadoop連接到eclipse,通過eclipse插件啓動作業,mapreduce作業可以成功完成,但是當我將我的代碼編譯到jar文件,然後通過hadoop命令執行這個工作,它會拋出如下錯誤。mapreduce錯誤:java.lang.indexoutofboundsexception:index:2,size:2

Error:java.lang.IndexOutOfBoundsException:Index:1,Size:1 
     at java.util.ArrayList.rangecheck(Arraylist.java:635) 
     at java.util.ArrayList.get(ArrayList.java:411) 
     at Combiner.reduce(Combiner.java:32) 
     at Combiner.reduce(Combiner.java:1) 

和我的代碼如下:

import java.io.IOException; 
import java.util.ArrayList; 
import java.util.Comparator; 
import java.util.Iterator; 
import java.util.PriorityQueue; 

import org.apache.hadoop.io.Text; 
import org.apache.hadoop.mapred.MapReduceBase; 
import org.apache.hadoop.mapred.OutputCollector; 
import org.apache.hadoop.mapred.Reducer; 
import org.apache.hadoop.mapred.Reporter; 


public class Combiner extends MapReduceBase implements Reducer<Text,Text,Text,Text>{ 
    public void reduce(Text  key,Iterator<Text>values,OutputCollector<Text,Text>output,Reporter reporter) 
      throws IOException{ 
     int num=3; 
     Comparator<String> comparator=new MyComparator(); 
     PriorityQueue<String> queue=new PriorityQueue<String>(100,comparator); 
     ArrayList<String> list=new ArrayList<String>(); 
     while(values.hasNext()){ 
      String str=values.next().toString(); 
      queue.add(str); 
     } 
     while(!queue.isEmpty()){ 

      list.add(queue.poll()); 

     } 
     String getCar=""; 
     for(int i=0;i<num;i++){ 
      getCar=getCar+list.get(i)+"\n"; 

     } 
     output.collect(new Text(""), new Text(getCar)); 
    } 

    public class MyComparator implements Comparator<String>{ 
     public int compare(String s1,String s2){ 
      if(Long.parseLong(s1.split(",")[4])>Long.parseLong(s2.split(",")[4])){ 
       return 1; 
      }else if(Long.parseLong(s1.split(",")[4])<Long.parseLong(s2.split(",")[4])){ 
       return -1; 
      }else{ 
       return 0; 
      } 
     } 
    } 
} 

回答

0

出現這種情況,是因爲你的列表中有一個元素(Size:1),和你問的第二個元素(Index:1 - 索引從零開始)!一個簡單的System.out.println爲每個列表元素將幫助你通過...

爲什麼你設置元素的數量爲3?如果你知道,這將是3(不太可能),則列表改爲3大小的數組如果你不知道,然後更改numlist.size(),如:

for(int i=0;i<list.size();i++) 

但是先天下之憂,你應該明白爲什麼你得到這個鍵的這些值。