【问题标题】:transient fields of case class becomes null in Spark rdd案例类的瞬态字段在 Spark rdd 中变为空
【发布时间】: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


【解决方案1】:

您可以启用 Kryo 序列化而不是默认的 Java 序列化。 Kryo 可以在不实现java.io.Serializable 的情况下序列化对象。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-02-24
    • 2014-11-28
    • 1970-01-01
    • 2020-03-15
    • 2012-09-01
    • 2021-07-14
    • 2021-09-27
    • 1970-01-01
    相关资源
    最近更新 更多