比较方法违反了它在 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)
我试着对我的 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)