2016-03-21 24 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関数はロングタイプのデータを返すので、bool型が必要です。例外を取得する方法はありません。 一部のデータリストはうまく機能しますが、他のデータ(特に1GB以上の大きなデータ)はこのエラーでは機能しません。

Comparison method violates its general contract 

任意のアイデアですか?

+0

'あなたの値の種類何myList'? – eliasah

+0

RDD [行]であり、.toListメソッドでリストを作成しました –

+0

RDD [行]を.toListでリストに変換することはできません! – eliasah

答えて

1

あなたのコンパレータの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)

+0

私はそれを取得しません。 diff(A、B)とdiff(B、C)は0を返しますが、diff(A、C)は長い値を返します。 –

+0

正確です。あなたは3つの値A、B、Cを持っています。比較は diff(A、B)= 0 => A = B、 diff(B、C)= 0 => B = C、したがってA = B = C 。つまり、diff(A、C)も0にする必要がありますが、必ずしもそうである必要はありません。 –

関連する問題