Scala IllegalArgumentException:can';t序列化类

Scala IllegalArgumentException:can';t序列化类,scala,serialization,apache-spark,kryo,Scala,Serialization,Apache Spark,Kryo,我有一个非常简单的类,我试图使用spark来减少它。 由于某些原因,它不断抛出异常,无法序列化类。 这是我的班级: @SerialVersionUID(1000L) class TimeRange(val start: Long, val end: Long) extends Serializable { def this(){ this(0,0) } def mergeOverlapping(rangesSet : Set[TimeRange]) = { de

我有一个非常简单的类,我试图使用spark来减少它。 由于某些原因,它不断抛出异常,无法序列化类。 这是我的班级:

@SerialVersionUID(1000L)
class TimeRange(val  start: Long, val end: Long) extends Serializable {

  def this(){
    this(0,0)
  }

  def mergeOverlapping(rangesSet : Set[TimeRange]) = {
    def minMax(t1: TimeRange, t2: TimeRange) : TimeRange = {
      new TimeRange(if(t1.start < t2.start) t1.start else t2.start, if(t1.end > t2.end) t1.end else t2.end)
    }
    (rangesSet ++ Set(this)).reduce(minMax)
  }


  def containsSlice(timeRange: TimeRange): Boolean ={
    (start < timeRange.start && end > timeRange.start) ||
      (start > timeRange.start && start < timeRange.end)
  }

  override def toString = {
    "("+ start + ", " + end + ")"
  }
}
我正在使用Scala 2.11和Spark 1.6.1

编辑: 使用相同的映射器和reducer,但不使用类TimeRange,而是使用(Long,Long)工作

def mergeOverlapping(currRange:(Long,Long),range Set:Set[(Long,Long)]={
def最小值(t1:(长,长),t2:(长,长)):(长,长)={
(如果(t1.\U1t2.\U2)t1.\U2其他t2.\U2)
}
(rangesSet++Set(currRange)).reduce(最小最大值)
}
def包含片(t1:(长,长),t2:(长,长)):布尔值={
(t1.\u 1t2.\u 1)||
(t1._1>t2._1&&t1._1
我认为这个类可以序列化,但是在Spark中使用它时,必须确保闭包集中的所有变量都可以序列化。我在学习Spark时遇到了这种问题,大多数情况下是因为在闭包中包含了另一个不可序列化的变量(map或reduce方法中的代码)。如果您能向代码展示如何使用此类,这可能会有所帮助。

如果是这样,没有类包装器,我将无法使用类对象。这意味着我可以使用(长,长)而不是时间范围,一切都正常。我将添加匹配(Long,Long)变量的containsSlice和mergeOverlapping。我的意思是,如何在spark相对代码中使用它。我测试了一个简单的例子,没有错误报告val sc=new SparkContext(new SparkConf().setMaster(“local[2]”)setAppName(“test”))val tset=Set[TimeRange]()val ret=sc.parallelize(Range(0100)).map(,new TimeRange(1,2)).reduceByKey((v1,v2)=>v1.mergeOverlapping(tset)).collect()ret.foreach(println())`此外,对于reduce函数,通常采用(A,A)=>A的格式,我不明白如何在spark中使用
mergeOverlapping
。您可以添加错误和堆栈跟踪吗?Sparks Closer Cleaner通常会告诉您是哪个字段引起了问题。
conf.set("spark.serializer", "org.apache.spark.serializer.KryoSerializer")
conf.registerKryoClasses(Array(classOf[TimeRange], classOf[Set[TimeRange]]))
 def mergeOverlapping(currRange : (Long, Long), rangesSet : Set[(Long, Long)]) = {
     def minMax(t1: (Long, Long), t2: (Long, Long)) : (Long, Long) = {
       (if(t1._1 < t2._1) t1._1 else t2._1, if(t1._2 > t2._2) t1._2 else t2._2)
     }
     (rangesSet ++ Set(currRange)).reduce(minMax)
   }

    def containsSlice(t1: (Long, Long), t2 : (Long, Long)): Boolean ={
      (t1._1 < t2._1 && t1._2 > t2._1) ||
        (t1._1 > t2._1 && t1._1 < t2._2)
    }