Scala/Spark序列化错误-加入don';行不通
我试图在2RDD之间使用连接方法并将其保存到cassandra,但我的代码不起作用。一开始,我得到了一个巨大的Main方法,一切都很好,但是当我使用函数和类时,这就不起作用了。我是scala和spark的新手 代码是:Scala/Spark序列化错误-加入don';行不通,scala,apache-spark,serialization,rdd,Scala,Apache Spark,Serialization,Rdd,我试图在2RDD之间使用连接方法并将其保存到cassandra,但我的代码不起作用。一开始,我得到了一个巨大的Main方法,一切都很好,但是当我使用函数和类时,这就不起作用了。我是scala和spark的新手 代码是: class Migration extends Serializable { case class userId(offerFamily: String, bp: String, pdl: String) extends Serializable case cla
class Migration extends Serializable {
case class userId(offerFamily: String, bp: String, pdl: String) extends Serializable
case class siteExternalId(site_external_id: Option[String]) extends Serializable
case class profileData(begin_ts: Option[Long], Source: Option[String]) extends Serializable
def SparkMigrationProfile(sc: SparkContext) = {
val test = sc.cassandraTable[siteExternalId](KEYSPACE,TABLE)
.keyBy[userId]
.filter(x => x._2.site_external_id != None)
val profileRDD = sc.cassandraTable[profileData](KEYSPACE,TABLE)
.keyBy[userId]
//dont work
test.join(profileRDD)
.foreach(println)
// don't work
test.join(profileRDD)
.saveToCassandra(keyspace, table)
}
一开始,我在线程“main”org.apache.spark.SparkException中得到了一个著名的:Exception:Task不可序列化于。
因此,我扩展了我的主类和case类,但仍然不起作用。我认为您应该将case类从
迁移
类移动到专用文件和/或对象。这应该能解决你的问题。此外,Scala案例类在默认情况下是可序列化的。它正在工作!我现在觉得自己很愚蠢。你能给我解释一下为什么吗?嗨@user3394825,很难说,因为我没有和卡桑德拉一起使用Spark。根据我的经验,在使用其他类中定义的case类时,我遇到了类似的问题。在您的情况下,为cassandraTable
函数()创建隐式参数可能会出现一些问题,例如rrf:RowReaderFactory[T],ev:validrdtype[T]
,但我只是在猜测。我知道在使用Spark SQL Encoder时也有类似的例外情况。case类在技术上是内部类,可以访问封闭的迁移实例。当它们被序列化时,伴随的迁移对象也被序列化。而且,即使它被标记为可序列化,其中可能有某个实例变量不是。通常罪魁祸首是SparkContext对象。