Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么scala方法可序列化,而函数不可序列化?_Scala_Apache Spark - Fatal编程技术网

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

为什么scala方法可序列化,而函数不可序列化?,scala,apache-spark,Scala,Apache Spark,我有一个spark RDD定义如下: val dataset = CreateRDD(data.filter(someFilter)) object Tests { def isNegative(num: Int): Boolean = num < 0 } 我观察到以下情况: //if filter is defined as function, such as following, //then spark will throw spark `task not serialis

我有一个spark RDD定义如下:

val dataset = CreateRDD(data.filter(someFilter))
object Tests {
  def isNegative(num: Int): Boolean = num < 0
}
我观察到以下情况:

//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
现在,
isNegative
是可序列化的
测试的成员。当你称之为:

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

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

这些定义(val/def)在哪里声明?它们是否声明为类的成员?一个物体?或者作为某些方法实现中的局部变量?这些选项之间的行为可能不同…方法不可序列化。是的,包括确切错误消息在内的更多上下文非常重要。可能是在第一个示例中,由于某种原因,类被捕获到闭包中。@pedrofurla虽然方法可能不是严格可序列化的,spark会尝试通过序列化它们所属的整个类来解决这个问题。这就是JVM中一般序列化的工作方式,@DavisBroda。顺便说一句,类也不是序列化的。对象被序列化。
val dataset = CreateRDD(data.filter(isNegative))