2011-07-03 60 views
4

我正在嘗試爲我爲Python插件dumbo編寫的hadoop流作業設置mongo-hadoop驅動程序擴展。java.lang.ClassCastException即使我將其轉換爲擴展類

dumbo項目需要我使用TypedBytesWritable類。所以我做了一個新的InputFormat & RecordReader像這樣:

package com.mongodb.hadoop; 

public class TypedBytesTableInputFormat implements InputFormat<TypedBytesWritable, TypedBytesWritable> { 

@Override 
public RecordReader<TypedBytesWritable, TypedBytesWritable> getRecordReader(InputSplit split, 
                      JobConf job, 
                      Reporter reporter) { 

    if (!(split instanceof MongoInputSplit)) 
     throw new IllegalStateException("Creation of a new RecordReader requires a MongoInputSplit instance."); 

    final MongoInputSplit mis = (MongoInputSplit) split; 

    //**THE FOLLOWING LINE THROWS THE ERROR** 
    return (RecordReader<TypedBytesWritable, TypedBytesWritable>) new TypedBytesMongoRecordReader(mis); 
} 

這裏是擴展RecordReader:

package com.mongodb.hadoop.input; 
... 
... 
import org.apache.hadoop.mapreduce.RecordReader; 
... 
... 

public class TypedBytesMongoRecordReader extends RecordReader<TypedBytesWritable, TypedBytesWritable> { 

public TypedBytesMongoRecordReader(MongoInputSplit mis) { 
    _cursor = mis.getCursor(); 
} 

@Override 
public void close() { 
    if (_cursor != null) 
     _cursor.close(); 
} 

但是當我運行的作業,它拋出這個錯誤。我不知道爲什麼,它是RecordReader的孩子。我究竟做錯了什麼?這裏是RecordReader類的API文檔。我以爲我是在做正確的一切:

http://hadoop.apache.org/common/docs/current/api/org/apache/hadoop/mapreduce/RecordReader.html

我做試驗的人被強制轉換爲一個RecordReader行警告,但沒有錯誤,它建造的jar就好了。警告:

Type safety: Unchecked cast from TypedBytesMongoRecordReader to RecordReader<TypedBytesWritable,TypedBytesWritable> 
+3

執行類生活在同一個類加載器? – mschonaker

+0

哦,dangit。一個在包com.mongodb.hadoop中,另一個在包com.mongodb.hadoop.input中;那會導致我的問題?還是你的意思是別的?我是Java新手。 :) – Nathan

+1

你不應該需要演員。如果由於多態性而遺傳正確。刪除演員,看看編譯器說什麼。 – Dunes

回答

1

試試這個:

public <T extends RecordReader<TypedBytesWritable, TypedBytesWritable>> T getRecordReader(InputSplit split, JobConf job, Reporter reporter) { 

    if (!(split instanceof MongoInputSplit)) 
     throw new IllegalStateException("Creation of a new RecordReader requires a MongoInputSplit instance."); 

    final MongoInputSplit mis = (MongoInputSplit) split; 

    return new TypedBytesMongoRecordReader(mis); // you may need a cast (T) - try it without first 
} 
相關問題