Scala/Spark序列化错误-加入don';行不通

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

我试图在2RDD之间使用连接方法并将其保存到cassandra,但我的代码不起作用。一开始,我得到了一个巨大的Main方法,一切都很好,但是当我使用函数和类时,这就不起作用了。我是scala和spark的新手

代码是:

  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对象。