2015-11-14 15 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因为它涉及的价值观密钥,通过密钥排序,然后抓住了值,但它看起来比你后者的解决方案更漂亮。在效率方面,我认为你不会找到更有效的解决方案,因为您需要一种转换数据的方式,使得值成为您的密钥(然后最终将数据转换回原始模式)。

相关问题