Как сделать мой класс Java доступным для записи, расширив его с помощью класса scala?

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

person Marat Saitkulov    schedule 11.05.2018    source источник
comment
@GhostCat, я думаю, это вопрос больше для пользователей искры =)   -  person Marat Saitkulov    schedule 11.05.2018
comment
Scaladized искра пользователи, которые есть!   -  person GhostCat    schedule 11.05.2018
comment
Вы проверили разрешение проблем с зависимостями в Apache Spark?   -  person Alper t. Turker    schedule 11.05.2018


Ответы (1)


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, вероятно, она была определена в консоли, а не в файле). Как только вы действительно скомпилируете класс и убедитесь, что он используется в других файлах, проблема должна быть решена.

person Alexey Romanov    schedule 12.05.2018
comment
Добавил конвертацию .toByte, не помогло. Насчет версии все в порядке, если вы имеете в виду, что сначала я записал в файл, используя одну версию ClassBWritable, а затем пытаюсь читать, используя другую версию моего класса. - person Marat Saitkulov; 12.05.2018