2011-05-17 42 views
7

当我从2.8.1迁移到Scala 2.9.0时,除了Hadoop映射器之外,所有的代码都是可用的。因为我在路上,有一些包装对象,我提炼到下面的例子:如何在Scala 2.9.0中实现Hadoop Mapper?

 
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作业对象下面是方法的定义:

public void setMapperClass(java.lang.Class<? extends org.apache.hadoop.mapreduce.Mapper> cls) throws java.lang.IllegalStateException { /* compiled code */ } 

定义Ø f Mapper类本身是这样的:

public class Mapper<KEYIN, VALUEIN, KEYOUT, VALUEOUT> 

有没有人对我做错了什么感觉?在我看来,这种类型基本上是正确的:MyMapper扩展了Mapper,并且该方法需要扩展Mapper的东西。它在2.8.1中效果很好...

+0

FWIW,我也没有看到一个错误。确保你使用的是2.9.0.Final,而不是一些早期的RC。如果您确实在使用Final,请检查票证数据库中的内容,或者在此处打开票证。 – 2011-05-17 16:06:59

+1

非常感谢丹尼尔!我在这里输入了一张票:https://lampsvn.epfl.ch/trac/scala/ticket/4603 – 2011-05-17 18:36:57

+1

Scala已迁移到Jira,所以现在问题在:https://issues.scala-lang.org/browse/ SI-4603 – 2011-05-18 21:39:11

回答

4

看起来很愚蠢,您可以通过在作业之前定义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]) 
    } 
}