Scala 序列化带有或不带有@transient的惰性val时的差异
使用spark时,有时我需要在每个任务中发送一个不可序列化的对象 一种常见的模式是Scala 序列化带有或不带有@transient的惰性val时的差异,scala,serialization,apache-spark,lazy-initialization,transient,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(insta
@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))
我发现这里不需要@transient
<代码>惰性val已经可以在执行每个任务时创建不可序列化的。但是人们建议使用@transient
惰性val
时,将其设置为@transient
,有什么好处val
暂时用于序列化是否有意义,就像上面的示例一样@transient lazy val
?它是作为一种方法还是其他什么@transient lazy val
和编译的java字节码的一些详细信息非常棒。请参见此处-
在Scala中,lazy val表示一个字段,该字段只有在第一次访问时才会进行计算,然后存储以供将来参考。另一方面,使用@transient可以表示不应序列化的字段