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

これはscala2.9.0(私が使用していたもの)のバグのようです。私がscala2.9.1にアップグレードしたとき、問題はなくなりました。

于 2012-04-21T15:18:18.253 に答える