2017-05-26 58 views
4

我有這樣定義的火花RDD:爲什麼scala方法在函數不可串行的時候?

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是一個特徵,創建的匿名函數是不可序列化的。當你有這樣的事情:

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

現在isNegativeTests成員是序列化的。當調用此:

星火需要運送出到每一個節點之前連載isNegative。由於對象是可序列化的,如果它的所有成員都是可序列化的,所以當你使用def時,它可以正常工作,但是當你使用val時,Spark將嘗試序列化isNegative的值,這是一個不可序列化的匿名函數並失敗。

相關問題