2011-07-03 9 views
4

私はPythonプラグインdumbo用に作成したhadoopストリーミングジョブのドライバ拡張子mongo-hadoopをセットアップしようとしています。java.lang.ClassCastException拡張クラスにキャストしていても

ダンボプロジェクトでは、TypedBytesWritableクラスを使用する必要があります。

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です::だから私はそうのような新しいのInputFormat & 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

ああ。 1つはパッケージcom.mongodb.hadoopにあり、もう1つはパッケージ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 
} 
関連する問題