如何在Scala 2.9.0中实现Hadoop Mapper?

当我从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])

失败的调用是在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中很好用...


看起来很傻,你可以在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])
  }
}
链接地址: http://www.djcxy.com/p/52759.html

上一篇: How does one implement a Hadoop Mapper in Scala 2.9.0?

下一篇: click publish not working from VS2010