Когда я переходил на 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 отлично работает ...