Проверка типов взаимодействия Scala Java

Я не могу исправить эти ошибки проверки типов в Scala:

package junk

import org.apache.hadoop.conf.Configuration
import org.apache.hadoop.io.IntWritable
import org.apache.hadoop.io.Text
import org.apache.hadoop.mapreduce.lib.input.TextInputFormat
import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat
import org.apache.hadoop.mapreduce.Job

object Sample {
  val conf: Configuration = new Configuration()
  val job: Job = new Job(conf, "sample Hadoop MapReduce program");

  job.setInputFormatClass(classOf[TextInputFormat])
  job.setOutputFormatClass(classOf[TextOutputFormat])
  job.setOutputFormatClass(classOf[TextOutputFormat[Text, IntWritable]])
}    

Сообщения об ошибках

Sample.scala:14: error: type mismatch;
found   : java.lang.Class[org.apache.hadoop.mapreduce.lib.input.TextInputFormat](classOf[org.apache.hadoop.mapreduce.lib.input.TextInputFormat])
required: java.lang.Class[_ <: org.apache.hadoop.mapreduce.InputFormat]
 job.setInputFormatClass(classOf[TextInputFormat])
                                ^
Sample.scala:15: error: class TextOutputFormat takes type parameters
 job.setOutputFormatClass(classOf[TextOutputFormat])
                                  ^
Sample.scala:16: error: type mismatch;
found   : java.lang.Class[org.apache.hadoop.mapreduce.lib.output.TextOutputFormat[org.apache.hadoop.io.Text,org.apache.hadoop.io.IntWritable]](classOf[org.apache.hadoop.mapreduce.lib.output.TextOutputFormat])
required: java.lang.Class[_ <: org.apache.hadoop.mapreduce.OutputFormat]
 job.setOutputFormatClass(classOf[TextOutputFormat[Text, IntWritable]])

Обратите внимание, что я пытался установить OutputFormatClass двумя разными способами, и оба не увенчались успехом.

Я пытаюсь написать Hadoop WordCount: http://wiki.apache.org/hadoop/WordCount в Скала. Эквивалентные строки в Java:

job.setInputFormatClass(TextInputFormat.class);
job.setOutputFormatClass(TextOutputFormat.class);

Документация по API для задания: http://hadoop.apache.org/common/docs/current/api/org/apache/hadoop/mapreduce/Job.html


person chris    schedule 19.06.2011    source источник
comment
См. stackoverflow.com/questions/ 6892359/. Проблема может заключаться в ошибке Scala.   -  person schmmd    schedule 01.09.2011


Ответы (2)


Начиная со Scala 2.9.1 (не Scala 2.9.0 — см. https://issues.scala-lang.org/browse/SI-4603), это также работает:

job.setInputFormatClass(classOf[TextInputFormat])
person jhclark    schedule 01.09.2011

См. раздел Программирование на Scala, экзистенциальные типы.

val textInputFormatClass = classOf[TextInputFormat].
     asInstanceOf[Class[T] forSome {type T <: InputFormat[String, String]}]

job.setInputFormatClass(textInputFormatClass)

Замените типы, которые вы используете для [String, String]

scala> val textInputFormatClass = classOf[TextInputFormat].asInstanceOf[Class[T] forSome {type T <: InputFormat[String, String]}]
textInputFormatClass: java.lang.Class[_ <: org.apache.hadoop.mapreduce.InputFormat[String,String]] = class org.apache.hadoop.mapreduce.lib.input.TextInputFormat

scala> val job = new Job
job: org.apache.hadoop.mapreduce.Job = org.apache.hadoop.mapreduce.Job@4a205144

scala> job.setInputFormatClass(textInputFormatClass)

scala>
person sourcedelica    schedule 19.06.2011
comment
Определенно на правильном пути здесь. К сожалению, первая строка выдает ошибку сообщения об ошибке: класс InputFormat принимает параметры типа, и если я добавляю параметры типа или подстановочные знаки в InputFormat, то вторая строка не компилируется, потому что подпись отличается. - person chris; 19.06.2011
comment
Итак, я скачал Hadoop сейчас :) Обновленный ответ. - person sourcedelica; 20.06.2011
comment
Спасибо, что пошел на все проблемы. Я попробовал это и получил следующую ошибку как в компиляторе, так и в интерпретаторе Scala 2.9.0: Обнаружена ошибка: java.lang.Class [T], где тип T ‹: org.apache.hadoop.mapreduce.InputFormat [String, String] required : java.lang.Class[_ ‹: org.apache.hadoop.mapreduce.InputFormat] - person chris; 20.06.2011
comment
Этот код не работает в версии 2.9.0 и исправлен в версии 2.9.1: issues.scala- lang.org/browse/SI-4603 - person jhclark; 02.09.2011