当前位置: 首页 > 知识库问答 >
问题:

火花对象不可序列化[重复]

微生嘉
2023-03-14

有没有关于为什么整个对象B需要序列化的想法?

object A{

  def main(args:Array[String])= {
    val conf = new SparkConf().setAppName("test").setMaster("local")
    val sc = new SparkContext(conf)
    val rdd=sc.makeRDD(Seq(1,2,3,4,5,6,7))
    val b=new B
    b.add(rdd)
  }
}
class B {

  val s="456"
  def add=(rdd:RDD[Int])=>{
    rdd.map(e=>e+" "+s).foreach(println)
  }
}

关于“对象不可序列化”的异常:

Serialization stack:
- object not serializable (class: B, value: B@1fde4f40)
- field (class: B$$anonfun$add$1, name: $outer, type: class B)
- object (class B$$anonfun$add$1, <function1>)
- field (class: B$$anonfun$add$1$$anonfun$apply$1, name: $outer, type: class B$$anonfun$add$1)
- object (class B$$anonfun$add$1$$anonfun$apply$1, <function1>)

共有1个答案

宗安宁
2023-03-14

请参见链接任务not serializable:java。伊奥。仅在类而非对象上调用闭包外函数时发生NotSerializableException。你的语法是什么

def add=(rdd:RDD[Int])=>{
  rdd.map(e=>e+" "+s).foreach(println)
}

真正的意思是

def addReal(): RDD[Int] => Unit = (rdd: RDD[Int]) => {
  val rddFunc: Int => String = e => e + " " + s
  rdd.map(rddFunc).foreach(println)
}

所以现在rddFunc从其包含对象B的上下文中捕获s,这是通过实际捕获不可序列化的整个对象B来完成的。

因此,除了链接答案中列出的选项外,还应该帮助您将添加到

def add(rdd:RDD[Int]) = {
  val localS = s
  rdd.map(e => e + " " + localS).foreach(println)
}

主要技巧是引入局部变量,强制rddFunc只捕获它,而不是整个B。

旁注:在上面的代码中,我还更改了您的添加的签名

def add():Function1[RDD[Int], Unit]  

你必须这么做

def add(rdd:RDD[Int]):Unit

如果add返回一个立即调用的函数,则没有任何好处。

 类似资料:
  • 我的spark任务是在运行时抛出不可序列化的任务。谁能告诉我我做错了什么吗? 以下是stacktrace:

  • 当我运行Spark Scala程序时,有一个“Task not serializable”异常 Spark RDD是不可串行化类型(java类) 调用的函数来自不可序列化的类(java类,再次) 我的代码是这样的 我注意到我可以用 但对于RDD中的对象类,我仍然会遇到这个例外。我会以另一种方式,也会以另一种方式,也就是第二部分,因为我不想创建大量PredicateClass的对象。 你能帮我吗?我

  • 首先,我使用的是scala 2.10.4,上面的例子是在Spark 1.6中运行的(尽管我怀疑Spark与此有关,但这只是一个序列化问题)。 所以我的问题是:假设我有一个trait,它由两个类实现,比如说和。现在,我有一个泛型特征,它由一组类扩展,其中一个类位于的子类型之上,例如(这里我保留了Spark对RDD的概念,但一旦序列化,它实际上可能是另一个类;不管实际情况如何,它都只是一个结果): 现

  • 将现有应用程序从Spark 1.6移动到Spark 2.2*(最终)会导致错误“org.apache.spark.SparkExctive:任务不可序列化”。我过于简化了我的代码,以演示同样的错误。代码查询拼花文件以返回以下数据类型:“org.apache.spark.sql.数据集[org.apache.spark.sql.行]”我应用一个函数来提取字符串和整数,返回字符串。一个固有的问题与Sp

  • 我有以下用于序列化查询集的代码: 下面是我的 我需要将其序列化。但它说无法序列化

  • 我正在试验Stanford CoreNLP库,我想序列化主要的StanfordCoreNLP管道对象,尽管它抛出了一个java.io.NotSerializableException。 完整故事:每当我运行我的实现时,将管道注释器和分类器加载到内存中大约需要15秒。最终进程的内存约为600MB(很容易小到可以存储在我的机箱中)。我想在第一次创建管道后保存它,这样我就可以在以后将其读入内存。 然而,