java.lang.ClassCastException, даже если я приведу его к расширенному классу - PullRequest
4 голосов
/ 03 июля 2011

Я пытаюсь настроить mongo-hadoop расширения драйвера для заданий потоковой передачи hadoop, которые я написал для плагина python dumbo .

Проект 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. Что я делаю неправильно? Вот документация API для класса RecordReader. Я думал, что все делал правильно:

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

Я получаю предупреждение о строке, которая передается в RecordReader, но ошибок нет, и она прекрасно создает банку. Предупреждение:

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

1 Ответ

1 голос
/ 03 июля 2011

Попробуйте это:

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
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...