比较方法违反了它在 Spark 中的一般契约

Comparison method violates its general contract in Spark

我试着对我的 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 函数return Long 类型数据和wortWith 需要bool 类型,因此无法获取异常。 一些数据列表工作得很好,但其他的(尤其是超过 1gb 的大数据)不适用于此错误。

Comparison method violates its general contract

有什么想法吗?

我认为是因为您的比较器 getDiffMinute 没有正确编写。 在你的情况下,假设 B 为空,那么 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)