【发布时间】:2020-07-20 20:36:16
【问题描述】:
我有一个案例类,它接受 java 类 LinkedSparseMatrix(包 - no.uib.cipr.matrix.sparse)的实例作为 -
case class A(mat: LinkedSparseMatrix)
当我尝试将 List[LinkedSparseMatrix] 转换为 Spark RDD 时,它会抛出 TaskNotSerializableException。所以我将该字段声明为瞬态。但是随后所有的 mat 字段都变为 null,我认为这是由于定义为瞬态的对象的默认值。
所以,我尝试将变量定义为惰性,从而将我的类更改为 -
class A (m: LinkedSparseMatrix) extends Serializable {
@transient lazy val mat = m
// some other code
}
但现在,我仍然收到 - java.io.NotSerializableException: no.uib.cipr.matrix.sparse.LinkedSparseMatrix - 我不明白为什么!
有什么解决办法吗?提前致谢。
【问题讨论】:
-
嗯,瞬态字段不会被序列化...如何让你的
LinkedSparseMatrix类可序列化? -
LinkedSparseMatrix来自一些java库。我没有定义它。有什么办法可以让它序列化吗?我不知道该怎么做。 -
也许你可以切换到kryo序列化。
-
Kryo 序列化抛出
StackOverFlowError。可能是在迭代中读取 rdd 并将它们合并到前一个中。 -
“在迭代中读取 rdd 并将它们合并到前一个中”到底是什么意思?你在做
listOfRDD.reduce(_ union _)之类的事情吗?
标签: java scala apache-spark rdd