Chr*_*s B 7 hadoop scala scala-2.9
当我从2.8.1迁移到Scala 2.9.0时,除了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])
Run Code Online (Sandbox Code Playgroud)
失败的调用是在Job对象上调用setMapperClass时.这是该方法的定义:
public void setMapperClass(java.lang.Class<? extends org.apache.hadoop.mapreduce.Mapper> cls) throws java.lang.IllegalStateException { /* compiled code */ }
Run Code Online (Sandbox Code Playgroud)
Mapper类本身的定义是这样的:
public class Mapper<KEYIN, VALUEIN, KEYOUT, VALUEOUT>
Run Code Online (Sandbox Code Playgroud)
有没有人知道我做错了什么?在我看来,类型基本上是正确的:MyMapper确实扩展了Mapper,并且该方法需要扩展Mapper的东西.它在2.8.1中运行良好......
尽管看起来很愚蠢,但您可以通过在作业之前定义映射器来解决该问题。编译如下:
import org.apache.hadoop._
import org.apache.hadoop.io._
import org.apache.hadoop.conf._
import org.apache.hadoop.mapreduce._
class MyMapper extends Mapper[LongWritable,Text,Text,Text] {
override def map(key: LongWritable, value: Text, context: Mapper[LongWritable,Text,Text,Text]#Context) {
}
}
object MyJob {
def main(args:Array[String]) {
val job = new Job(new Configuration())
job.setMapperClass(classOf[MyMapper])
}
}
Run Code Online (Sandbox Code Playgroud)