为什么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的值,这是一个不可序列化的匿名函数并且失败. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |