如何在PySpark中高效地按值排序?

13

我想按照值(V)对我的K,V元组进行排序。如果您知道需要多少个元素,则可以使用TakeOrdered

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方法进行排序。我很难相信takeOrdered如此简洁,却需要与Lambda解决方案相同数量的操作。

有没有人知道在Spark中是否有更简单、更简洁的转换方式来按值排序?

2个回答

23

我认为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)]

实际上,这种方法并不更有效率,因为它需要按值进行键控、按键排序,然后获取值,但它看起来比你后面的解决方案更美观。就效率而言,我认为你不会找到更有效率的解决方案,因为你需要一种方法来转换你的数据,使值成为你的键(然后最终将该数据转换回原始模式)。

4

我想补充一个提示,这对我非常有帮助。

升序:

bSorted = b.sortBy(lambda a: a[1])

降序:

bSorted = b.sortBy(lambda a: -a[1])

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接