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

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

为什么?

是的,函数/方法都被定义为测试规范中的成员

最佳答案 问题是这个:

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是可序列化的测试成员.当你这样称呼时:

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

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

点赞