为什么scala方法可序列化而不是函数?

时间:2017-05-26 14:32:46

标签: scala apache-spark

我有一个像这样定义的火花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 个答案:

答案 0 :(得分:1)

问题在于:

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
}

现在isNegativeTests的成员,可以序列化。当你这样称呼时:

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

Spark需要序列化isNegative才能将其发送到每个节点。由于对象是可序列化的,如果它的所有成员都是可序列化的,当你使用def时,它工作正常,但是当你使用val时,Spark会尝试序列化isNegative的值,这是一个不可序列化的匿名函数并失败。