【发布时间】:2015-12-30 07:00:04
【问题描述】:
我是 Scala 新手。为什么“地图”功能不可序列化?如何使其可序列化?例如,如果我的代码如下:
val data = sc.parallelize(List(1,4,3,5,2,3,5))
def myfunc(iter: Iterator[Int]) : Iterator[Int] = {
val lst = List(("a", 1),("b", 2),("c",3), ("a",2))
var res = List[Int]()
while (iter.hasNext) {
val cur = iter.next
val a = lst.groupBy(x => x._1).mapValues(_.size)
//val b= a.map(x => x._2)
res = res ::: List(cur)
}
res.iterator
}
data.mapPartitions(myfunc).collect
如果我取消注释该行
val b= a.map(x => x._2)
代码返回异常:
org.apache.spark.SparkException: Task not serializable
Caused by: java.io.NotSerializableException: scala.collection.immutable.MapLike$$anon$2
Serialization stack:
- object not serializable (class: scala.collection.immutable.MapLike$$anon$2, value: Map(1 -> 3))
- field (class: $iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC, name: a, type: interface scala.collection.immutable.Map)
非常感谢。
【问题讨论】:
-
据我所知,它在 Spark 1.2.0 - 1.5.0 上无法重现。可以提供一些配置细节吗?你如何执行这段代码?
-
嗨 zero323,我直接在 Spark 1.5 附带的 Scala shell 中运行了这段代码。我还在 Spark 1.0.1 的 Scala Shell 中运行了代码,也存在同样的问题。
-
我怀疑这不是给出错误的实际代码吗?您的
lst真的只是实际代码中的一个简单列表吗?还是另一个 RDD? -
嗨,保罗,这是我用来演示我的问题的代码的简化版本(我对简化代码也有同样的问题)。在我的确切代码中,参数“iter”是一个元组,并且 lst = iter._2.
-
@Carter 所以为了清楚起见-您实际上可以使用这段代码重现问题吗?不从函数返回
a或b。
标签: scala serialization apache-spark