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

  1. 什麼優勢,如果我們設定@transient未初始化序列化時,它lazy val

  2. 是否有意義的做一個非初始化的val瞬態序列化,知道沒有什麼會被序列化,就像上面的例子?

  3. @transient lazy val如何連載?它被視爲一種方法或別的東西嗎?

關於序列化@transient lazy val和編譯的java字節碼的一些細節很棒。

回答

相關問題