Как сделать мой java-класс доступным для записи, расширив его классом scala? - PullRequest
0 голосов
/ 11 мая 2018

Мне нужно saveAsSequenceFile мой объект класса Java (по какой-то причине я не могу исправить сам класс), для этого я должен сделать его доступным для записи. Я пытаюсь расширить свой класс Java классом Scala (могу использовать только Scala), реализуя метод write и readFields . Я могу сохранить в файл, но не могу прочитать:

java.lang.RuntimeException: java.lang.NoSuchMethodException: $iwC$$iwC$ClassBWritable.<init>()

Похоже, мне нужно создать начальный конструктор для моего ClassBWritable, но следующее не работает:

def this() = this(0, 0.0F)

Как сделать начальный конструктор или решить мою проблему? Мой класс ( нужно исправить его определение или добавить дополнительный конструктор ):

import ClassA
import java.io.{DataOutput, DataInput}
import org.apache.hadoop.io.Writable
import org.apache.hadoop.io.LongWritable
class ClassBWritable(field1: Byte, field2: Float) extends ClassA(field1, field2)  with Writable{
    def this() = this(0.toByte, 0.0F)       
    override def write(out: DataOutput): Unit = {
        out.writeByte(getField1)
        out.writeFloat(getfield2)            
    }
    override def readFields(in: DataInput) : Unit = {
        setField1(in.readByte())
        setField2(in.readFloat())
    }
}

Вот как я сохраняю в файл:

myrdd.map(pair => (new LongWritable(pair.longNumber) -> new ClassBWritable(pair.my_byte_value, pair.my_float_value)))
     .saveAsSequenceFile(mypath)

Как я читаю из файла:

val df = sc.sequenceFile(mypath, classOf[LongWritable], classOf[ClassBWritable])
      .map(row => (p._1.get(), row._2.getField1(), row._2.getField2()) )
      .take(1)

Мое исключение:

Caused by: java.lang.NoSuchMethodException: $iwC$$iwC$ClassBWritable.<init>()
    at java.lang.Class.getConstructor0(Class.java:3082)
    at java.lang.Class.getDeclaredConstructor(Class.java:2178)
    at org.apache.hadoop.util.ReflectionUtils.newInstance(ReflectionUtils.java:128)
    ... 15 more

1 Ответ

0 голосов
/ 12 мая 2018
class ClassBWritable(field1: Byte, field2: Long) ... {
    def this() = this(0, 0.0F, 0, 0.0F, 0.0F) ...

не может скомпилироваться: должно быть

    def this() = this(0.toByte, 0L)

вместо этого. Таким образом, у вас очевидно есть другая версия ClassBWritable в пути к классам (судя по $iwC$$iwC$ClassBWritable, она, вероятно, была определена в консоли, а не в файле). Как только вы на самом деле скомпилируете класс и убедитесь, что он используется в других файлах, проблема должна быть исправлена.

...