2016-03-21 45 views
0

我试图对我的List [Row]数据集进行排序,这里是我如何做的。比较方法违反了Spark中的一般合同

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 

任何想法?

+0

什么是你的价值'myList'的类型? – eliasah

+0

这是RDD [行],并使用.toList方法 –

+0

制作了列表,您无法使用.toList将RDD [行]转换为列表! – eliasah

回答

1

我认为这是因为你的比较器getDiffMinute没有正确写入。 (A,B)= 0,diff(B,C)= 0所以diff(A,C)也应该是0,但如果A和C都不是0,那么它可以是任何东西是空值。

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

+0

我不明白。我同意diff(A,B)和diff(B,C)返回0,但diff(A,C)会返回一些长整型值。 –

+0

没错。你有3个值,A,B,C,你的比较说 diff(A,B)= 0 => A = B,因此A = B = C 。这意味着diff(A,C)也应该为0,但那不一定如此。 –

相关问题