2016-09-23 139 views
1

在Spark中,我想通過兩個不同的字段對RDD進行排序。例如,在這裏的給定示例中,我想首先按fieldA對元素進行排序,然後在fieldB(二級排序)中排序。在給定示例中使用的方法是否足夠好?我已經測試了我的代碼,它可以工作。但是,這是一個可靠的方法嗎?通過在Spark中使用連接進行二次排序?

// x is of type (key, fieldA) and y of type (key, fieldB) 
val a = x.sortBy(_._2) 
// b will be of type (key, (fieldB, fieldA)) 
val b = y.join(x).sortBy(_._2._1)) 

因此,例如,我需要一個如下所示的輸出。

fieldA, fieldB 
2, 10 
2, 11 
2, 13 
7, 5 
7, 7 
7, 8 
9, 3 
9, 10 
9, 10 

回答

2

但是,這是一個可靠的方法嗎?

這是不可靠的。它取決於假設在洗牌過程中數據按分區順序定義的順序進行處理。這可能發生,但不能保證它會發生。

換言之,基於shuffle的排序並不穩定。一般來說,有些方法可以用來達到預期的結果,而不用兩次完全洗牌,但這些方法都很低,爲了達到最佳性能,需要定製Partitioner

2

您可以通過以下方式

y.join(x).sortBy(r => (r._2._2, r._2._1)) 

兩個排序,會一氣呵成發生使用sortBy

+0

但爲此,我想你將不得不定義排序變量如何排序類型的(A,B)。沒有?可能還有其他方法,但是我的問題與我正在使用的方法有關,如果那個方法可靠的話。 – pythonic

相關問題