gpt4 book ai didi

scala - 为什么 Scala 方法可以序列化而函数不能序列化?

转载 作者:行者123 更新时间:2023-12-01 04:48:39 26 4
gpt4 key购买 nike

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

为什么 ?

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

最佳答案

问题在于:

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 的成员(member)这是可序列化的。当你调用这个时:
val dataset = CreateRDD(data.filter(isNegative))

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

关于scala - 为什么 Scala 方法可以序列化而函数不能序列化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44204179/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com