我需要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/