加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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

发布时间:2020-12-16 08:46:05 所属栏目:安全 来源:网络整理
导读:我有一个像这样定义的火花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) =
我有一个像这样定义的火花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的值,这是一个不可序列化的匿名函数并且失败.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读