Мне нужно 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