7

当我从 Scala 2.8.1 迁移到 Scala 2.9.0 时,除了 Hadoop 映射器之外,所有代码都可以正常工作。因为我有一些包装对象,所以我提炼出下面的例子:

导入 org.apache.hadoop.mapreduce.{Mapper, Job}


对象我的工作{
  def main(args:Array[String]) {
    val 工作 = 新工作(新配置())
    job.setMapperClass(classOf[MyMapper])

  }
}

类 MyMapper 扩展 Mapper[LongWritable,Text,Text,Text] {
  覆盖 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])

失败的调用是当我在 Job 对象上调用 setMapperClass 时。这是该方法的定义:

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 中运行良好...

4

1 回答 1

4

看起来很愚蠢,您可以通过在 Job 之前定义 Mapper 来解决这个问题。以下编译:

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])
  }
}
于 2011-06-07T22:08:29.697 回答