我有以下RDD:
myRDD:org.apache.spark.rdd.RDD[(String, org.apache.spark.mllib.linalg.Vector)]
然后我想添加一个固定密钥:
myRdd.map(("myFixedKey",_)):org.apache.spark.rdd.RDD[(String, (String, org.apache.spark.mllib.linalg.Vector))]
但是如果我使用常量String val而不是硬编码/显式字符串:
val myFixedKeyVal:String = "myFixedKey"
myRdd.map((myFixedKeyVal,_))
此前一行代码提供以下异常:
org.apache.spark.SparkException: Task not serializable
我错过了什么吗?
解决方案:
好的我发现了问题,myRdd
是一个扩展Serializable类的对象,但在由另一个类处理这个RDD之后,例如Process
:
class Process(someRdd:MyRddClass) extends Serializable{
def preprocess = someRdd.map(_)
}
val someprocess = Process(myRdd)
val newRdd = someprocess.preprocess
newRdd.map(x=>("newkey",x)
此课程Process
也必须延长Serializable
才能发挥作用。我认为newRdd正在扩展根类MyRddClass
...
答案 0 :(得分:1)
字符串常量不是问题。使用-Dsun.io.serialization.extendedDebugInfo=true
打开序列化调试以找出真正的原因。