我需要saveAsSequenceFile我的Java类对象(由于某种原因我无法校正类本身),因此我必须使其可写。我正在尝试通过实现write和readFields方法来扩展Scala类(只能使用Scala)的Java类。我可以保存到文件,但看不到:

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

最佳答案

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判断,它可能是在控制台而不是文件中定义的)。一旦您实际编译了该类并确保它是其他文件中使用的那个类,就应解决此问题。

关于java - 如何通过使用scala类扩展Java类使其可写?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50294448/

10-11 03:48