Когда я перешел на Scala 2.9.0 с 2.8.1, весь код работал, кроме картографов Hadoop. Поскольку у меня были некоторые объекты-обертки, я перешел к следующему примеру:
import org.apache.hadoop.mapreduce.{Mapper, Job}
object MyJob {
def main(args:Array[String]) {
val job = new Job(new Configuration())
job.setMapperClass(classOf[MyMapper])
}
}
class MyMapper extends Mapper[LongWritable,Text,Text,Text] {
override def map(key: LongWritable, value: Text, context: Mapper[LongWritable,Text,Text,Text]#Context) {
}
}
Когда я запускаю это в 2.8.1, оно работает довольно хорошо (и у меня есть много производственного кода в 2.8.1. В 2.9.0 я получаю следующую ошибку компиляции:
error: type mismatch;
found : java.lang.Class[MyMapper](classOf[MyMapper])
required: java.lang.Class[_ <: org.apache.hadoop.mapreduce.Mapper]
job.setMapperClass(classOf[MyMapper])
Ошибка вызова, когда я вызываю setMapperClass для объекта Job. Вот определение этого метода:
public void setMapperClass(java.lang.Class<? extends org.apache.hadoop.mapreduce.Mapper> cls) throws java.lang.IllegalStateException { /* compiled code */ }
Определение самого класса Mapper таково:
public class Mapper<KEYIN, VALUEIN, KEYOUT, VALUEOUT>
У кого-нибудь есть чувство, что я делаю неправильно? Мне кажется, что тип в принципе правильный: MyMapper действительно расширяет Mapper, а метод хочет что-то, расширяющее Mapper. И это прекрасно работает в 2.8.1 ...