2016-03-21 60 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,但那不一定如此。 –

相關問題