Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/16.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_Serialization_Apache Spark - Fatal编程技术网

映射不能在scala中序列化?

映射不能在scala中序列化?,scala,serialization,apache-spark,Scala,Serialization,Apache Spark,我是斯卡拉的新手。为什么“map”函数不能序列化?如何使其可序列化?例如,如果我的代码如下所示: 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) {

我是斯卡拉的新手。为什么“map”函数不能序列化?如何使其可序列化?例如,如果我的代码如下所示:

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)

非常感谢。

这是众所周知的scala错误:Map#mapValues不可序列化

我们的Spark应用程序中存在这个问题,
map(identity)
解决了这个问题

rdd.groupBy(_.segment).mapValues(v => ...).map(identity)

您是否尝试过在应用程序中运行相同的代码?我怀疑这是火花壳的问题。如果您想让它在spark shell中工作,那么您可以尝试将
myfunc
的定义及其应用程序包装在花括号中,如下所示:

val data = sc.parallelize(List(1,4,3,5,2,3,5))

val result = { 
  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
}

下面提供了
mapValues
函数的实际实现,正如您所看到的,它不可序列化,只创建一个视图,而不是数据的正确存在,因此您会遇到此错误。按情况
mapValues
有许多优点

protected class MappedValues[C](f: B => C) extends AbstractMap[A, C] with DefaultMap[A, C] {
    override def foreach[D](g: ((A, C)) => D): Unit = for ((k, v) <- self) g((k, f(v)))
    def iterator = for ((k, v) <- self.iterator) yield (k, f(v))
    override def size = self.size
    override def contains(key: A) = self.contains(key)
    def get(key: A) = self.get(key).map(f)
}
protectedclassmappedvalues[C](f:B=>C)用DefaultMap[A,C]扩展了AbstractMap[A,C]{

覆盖def foreach[D](g:((A,C))=>D:Unit=for((k,v)据我所知,它在Spark 1.2.0-1.5.0上不可复制。可以提供一些配置细节吗?如何执行此代码?您好zero323,我直接在Spark 1.5附带的Scala外壳中运行了此代码。我也在Spark 1.0.1的Scala外壳中运行了此代码,并且存在相同的问题。我怀疑这不是导致错误的实际代码或者?你的
lst
真的只是实际代码中的一个简单列表吗?还是另一个RDD?嗨,保罗,这是我的代码的简化版本,用于演示我的问题(我对简化代码也有同样的问题)。在我的精确代码中,参数“iter”是一个元组,lst=iter.\u 2.@Carter所以说得清楚一点-你可以用这段代码重现这个问题吗?不需要从函数中返回
a
b
。这也是我的假设,但对我来说是可行的。谢谢!我永远都不会明白这一点。为什么会这样呢?@Mattew因为
mapValues
是懒惰的()我知道这听起来很奇怪,但在.mapValues(v=>…)中是什么代替了(…)的?我有一个Map[String,List[Set[String]]错误任务的当前链接/描述:我只在Spark Shell中尝试了这段代码。看起来这是Shell的问题所在。