8
使用spark時,有時需要在每個任務中發送不可序列化的對象。使用或不使用@transient序列化lazy val時的區別
一個常見的模式是@transient lazy val
,e.g
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
是沒有必要在這裏。 lazy val
已經可以在每個任務執行時創建不可序列化。但人們建議使用@transient
。
什麼優勢,如果我們設定
@transient
未初始化序列化時,它lazy val
?是否有意義的做一個非初始化的
val
瞬態序列化,知道沒有什麼會被序列化,就像上面的例子?@transient lazy val
如何連載?它被視爲一種方法或別的東西嗎?
關於序列化@transient lazy val
和編譯的java字節碼的一些細節很棒。