Как реализовать Hadoop Mapper в Scala 2.9.0? - PullRequest
7 голосов
/ 17 мая 2011

Когда я перешел на 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 ...

1 Ответ

4 голосов
/ 08 июня 2011

Глупо, как кажется, вы можете обойти проблему, определив 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])
  }
}
...