0

mapreduce 時代の既存のカスタム入力形式を再利用するために Spark を評価しようとしているときに、Java ジェネリックの問題に遭遇しました。

import com.google.protobuf.Message;
import com.twitter.elephantbird.mapreduce.io.ProtobufWritable;
public abstract class AbstractInputFormat<K extends Message, V> extends FileInputFormat<ProtobufWritable<K>, V>

...

import com.example.MyProto; // this extends Message
public class MyInputFormat extends AbstractInputFormat<MyProto, Text> 

...

SparkConf conf = new SparkConf().setAppName("Test");
SparkContext sc = new SparkContext(conf);
JavaSparkContext jsc = JavaSparkContext.fromSparkContext(sc);
JavaPairRDD myRdd = jsc.newAPIHadoopFile(logFile, MyInputFormat.class, ProtobufWritable.class, Text.class,
                    Job.getInstance().getConfiguration());

上記により、myRdd で次のエラーが発生します

Bound mismatch: The generic method newAPIHadoopFile(String, Class<F>, Class<K>, Class<V>, Configuration) of type JavaSparkContext is not applicable for the arguments (String, Class<MyInputFormat>, Class<ProtobufWritable>, Class<Text>, Configuration). The inferred type MyInputFormat is not a valid substitute for the bounded parameter <F extends InputFormat<K,V>>

何が起こっているのかわからない。私は境界を満たしているように思えますか?私は問題を見つけることができませんか?

これは、呼び出されている scala コードです。

4

1 に答える 1

0

次の変更は私のために働いた

public class MyInputFormat<K extends Message> extends AbstractInputFormat<MyProto, Text>

public abstract class AbstractInputFormat<K extends Message, V> extends FileInputFormat<ProtobufWritable<K>, V>
于 2016-07-31T10:08:27.600 に答える