使用或不使用@transient序列化惰性val时的差异

时间:2016-01-13 14:27:24

标签: scala serialization apache-spark lazy-initialization transient

使用spark,有时我需要在每个任务中发送一个不可序列化的对象。

常见模式为@transient lazy val,例如

class A(val a: Int)

def compute(rdd: RDD[Int]) = {
  // lazy val instance = {
  @transient lazy val instance = {
    println("in lazy object")
    new A(1)
  }
  val res = rdd.map(instance.a + _).count()
  println(res)
}

compute(sc.makeRDD(1 to 100, 8))

我发现此处不需要@transientlazy val可以在执行每个任务时创建非序列化。但人们建议使用@transient

  1. 如果我们在序列化时在非初始化@transient上设置lazy val,有什么好处?

  2. 为序列化创建一个非初始化val瞬态是否有意义,知道没有任何序列化,就像上面的例子一样?

  3. @transient lazy val是如何序列化的?它被视为一种方法还是别的什么?

  4. 序列化@transient lazy val和编译的java字节码的一些细节非常棒。

1 个答案:

答案 0 :(得分:7)

见这里 - http://fdahms.com/2015/10/14/scala-and-the-transient-lazy-val-pattern/

在Scala中,lazy val表示一个字段,只有在第一次访问时才会计算,然后存储以供将来参考。另一方面,使用@transient可以表示不能序列化的字段。