2017-05-26 6 views
4

私はこのように定義されたスパークRDDありますなぜスカラメソッドは機能しないうちにシリアル化できますか?

val dataset = CreateRDD(data.filter(someFilter)) 

を私は次の観察:

//if filter is defined as function, such as following, 
//then spark will throw spark `task not serialisable exception` 
val someFilter = (some) => true 
//if filter is defined as method, such as following then everything will be fine 
def someFilter(some) => true 

なぜですか?テスト仕様で

はい、関数/メソッドは、すべてのメンバーとして定義されている

+1

これらの定義(val/def)はどこに宣言されていますか?彼らはクラスのメンバーとして宣言されていますか?オブジェクト?または、メソッドの実装内のローカル変数として?これらのオプションの間で動作が異なる可能性があります。 –

+0

メソッドは直列化できません。 – pedrofurla

+2

はい正確なエラーメッセージを含むより多くのコンテキストが重要です。最初の例では、何らかの理由でクラスがクロージャーでキャプチャされている可能性があります。 – puhlen

答えて

0

問題は、このことです:

val isNegative = (num: Int) => num < 0 

は、このための単なるシンタックスシュガーです:

val isNegative = new Function1[Int, Boolean] { 
    def apply(num: Int): Boolean = num < 0 
} 

Function1はTraitであり、作成された無名関数は直列化できません。あなたはこのような何かを持っている場合:

object Tests { 
    def isNegative(num: Int): Boolean = num < 0 
} 

は今isNegativeは直列化可能ですTestsのメンバーです。これを呼び出すとき:

スパークは、各ノードにそれを出荷する前にisNegativeをシリアル化する必要があります。オブジェクトはすべてシリアライズ可能なので、defを使用するとうまく動作しますが、valを使用すると、代わりにisNegativeの値がシリアライズされます。これはシリアル化できない匿名関数であり、失敗します。

関連する問題