有没有关于为什么整个对象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>)
请参见链接任务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(很容易小到可以存储在我的机箱中)。我想在第一次创建管道后保存它,这样我就可以在以后将其读入内存。 然而,