2015-11-14 14 views
0

我想用V來排序我的K,V元組,即值。我知道TakeOrdered,給這個,如果你知道你需要多少:如何在PySpark中有效地進行排序?

b = sc.parallelize([('t',3),('b',4),('c',1)]) 

使用TakeOrdered:

b.takeOrdered(3,lambda atuple: atuple[1]) 

使用Lambda

b.map(lambda aTuple: (aTuple[1], aTuple[0])).sortByKey().map(
    lambda aTuple: (aTuple[0], aTuple[1])).collect() 

我已經簽出了問題here,這表明後者。我很難相信takeOrdered是如此簡潔,但它需要與Lambda解決方案相同數量的操作。

有沒有人知道一個更簡單,更簡潔的火花轉換按價值排序?

回答

3

我覺得sortBy()更簡潔:

b = sc.parallelize([('t', 3),('b', 4),('c', 1)]) 
bSorted = b.sortBy(lambda a: a[1]) 
bSorted.collect() 
... 
[('c', 1),('t', 3),('b', 4)] 

它實際上not more efficient at all因爲它涉及的價值觀密鑰,通過密鑰排序,然後抓住了值,但它看起來比你後者的解決方案更漂亮。在效率方面,我認爲你不會找到更有效的解決方案,因爲您需要一種轉換數據的方式,使得值成爲您的密鑰(然後最終將數據轉換回原始模式)。

相關問題