我有一个非常简单的课程,我正在努力减少使用火花。 由于某种原因,它不断抛出异常无法序列化类。 这是我的班级:
@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 + ")"
}
}
我也尝试过使用@SerialVersionUID(2L)
和Kryo:
conf.set("spark.serializer", "org.apache.spark.serializer.KryoSerializer")
conf.registerKryoClasses(Array(classOf[TimeRange], classOf[Set[TimeRange]]))
我正在使用Scala 2.11和Spark 1.6.1。
编辑: 使用相同的mapper和reducer但不使用类TimeRange使用(Long,Long)工作。
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)
}
答案 0 :(得分:1)
我认为这个类可以序列化,但是当你在Spark中使用它时,你必须确保闭包集中的所有变量都是可序列化的。我在学习Spark的过程中遇到过这种问题,而且大部分时间都是由于涉及另一个不可序列化到闭包中的变量(map或reduce方法中的代码)引起的。如果您可以显示代码如何使用此类,那可能会有所帮助。