0

我已经定义了一个自定义输入和输出格式XMLIO.scala

import scala.xml.Node
import org.apache.hadoop.lib.input.FileInputFormat
import org.apache.hadoop.lib.output.FileOutputFormat
import org.apache.hadoop.mapreduce.{ RecordReader, RecordWriter }
// ...
object XMLIO {
    class XMLInputFormat extends FileInputFormat[LongWritable, Node] { /*...*/ }
    class XMLRecordReader extends RecordReader[LongWritable, Node] { /*...*/ }
    class XMLOutputFormat extends FileOutputFormat[LongWritable, Node] { /*...*/ }
    class XMLRecordWriter extends RecordWriter[LongWritable, Node] { /*...*/ }
}

我正在尝试将其用于我正在定义的工作Example.scala

import XMLIO._
import org.apache.hadoop.conf.Configuration
import org.apache.hadoop.mapreduce.Job
object Example {
    @throws(classOf[Exception])
    def main( args : Array[String] ) {
        val job = new Job(new Configuration(), "")
        job setInputFormatClass classOf[XMLInputFormat]
    }
}

但是,这给了我一个编译器错误:

[ERROR] /path/to/Example.scala:8: error: type mismatch;
[INFO]  found   : java.lang.Class[XMLInputFormat](classOf[XMLInputFormat])
[INFO]  required: java.lang.Class[_ <: org.apache.hadoop.mapreduce.InputFormat]
[INFO]     job setInputFormatClass classOf[XMLInputFormat]
[INFO]                                    ^

这对我来说似乎很奇怪,因为它XMLInputFormat是 的子类FileInputFormat,它是 的子类InputFormat

在 REPL 中玩了一下,我发现了一个奇怪的解决方法。XMLInputFormat如果我在设置输入格式类之前创建了一个实例,则不会出现编译器错误。也就是说,以下编译良好:

import XMLIO._
import org.apache.hadoop.conf.Configuration
import org.apache.hadoop.mapreduce.Job
object Example {
    @throws(classOf[Exception])
    def main( args : Array[String] ) {
        val x = new XMLInputFormat()
        val job = new Job(new Configuration(), "")
        job setInputFormatClass classOf[XMLInputFormat]
    }
}

这里发生了什么?有没有一个看起来不像黑客的修复方法?

4

1 回答 1

1

看起来这是 scala 2.9.0 的错误(这是我正在使用的)。当我升级到 scala 2.9.1 时,问题就消失了。

于 2012-04-21T15:18:18.253 回答