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))
ここでは@transient
は不要であることがわかりました。 lazy val
は、各タスクの実行時に非シリアライズ可能を作成できます。しかし、人々は@transient
の使用を提案しています。
シリアル化するときに初期化されていない@transient
にlazy val
を設定すると、どのような利点がありますか?
上記の例のように、何もシリアル化されないことを知って、シリアル化のために初期化されていないval
を一時的にすることには意味がありますか?
@transient lazy val
はどのようにシリアル化されますか?それはメソッドとして扱われるのか、それとも他の何かとして扱われるのですか?
@transient lazy val
のシリアライズに関する詳細とコンパイルされたJavaバイトコードは素晴らしいです。
ここを参照してください- http://fdahms.com/2015/10/14/scala-and-the-transient-lazy-val-pattern/
Scala= lazy valは、最初にアクセスされたときにのみ計算され、その後の参照のために保存されるフィールドを示します。@ transientを使用すると、シリアル化されません。