比较方法违反了Spark中的一般合同

时间:2016-03-21 03:50:08

标签: sorting apache-spark comparison

我尝试对List [Row]数据集进行排序,这就是我为它做的。

def getDiffMinute(ts1:Timestamp, ts2:Timestamp) : Long = {
    if(ts1==null || ts2==null) 0 
    else (ts1.getTime - ts2.getTime) / 60000
}
myList.sortWith( (r1: Row, r2: Row) => 
    MYUtils.getDiffMinute( r1.getAs[Timestamp]("time"), r2.getAs[Timestamp]("time")) < 0
)

由于getDiffMinute函数返回Long类型数据并且wort需要bool类型,因此无法获得异常。 某些数据列表工作得很好,但其他数据列表(特别是超过1GB的大数据)不能用于此错误。

Comparison method violates its general contract

有这个想法吗?

1 个答案:

答案 0 :(得分:2)

我认为是因为你的比较器getDiffMinute没有正确编写。 在你的情况下,假设B为null,则diff(A,B)= 0,diff(B,C)= 0,因此diff(A,C)也应为0,但如果A和C都不是,则它可以是任何东西空值。

更多信息: http://docs.oracle.com/javase/6/docs/api/java/util/Comparator.html#compare(T,%20T)