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

Hun*_*nle 7 python sorting lambda apache-spark

我想用V对V,V元组进行排序,即按值排序.TakeOrdered如果你知道你需要多少,我知道这对你有好处:

b = sc.parallelize([('t',3),('b',4),('c',1)])
Run Code Online (Sandbox Code Playgroud)

运用 TakeOrdered:

b.takeOrdered(3,lambda atuple: atuple[1])
Run Code Online (Sandbox Code Playgroud)

运用 Lambda

b.map(lambda aTuple: (aTuple[1], aTuple[0])).sortByKey().map(
    lambda aTuple: (aTuple[0], aTuple[1])).collect()
Run Code Online (Sandbox Code Playgroud)

我在这里查看了这个问题,这表明后者.我发现很难相信它takeOrdered是如此简洁,但它需要与Lambda解决方案相同的操作数量.

有没有人知道更简单,更简洁的火花转换按值排序?

Roh*_*tty 15

我认为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)]
Run Code Online (Sandbox Code Playgroud)

它实际上并没有更高效,因为它涉及键值键入,按键排序,然后抓取值但它看起来比后一个解决方案更漂亮.在效率方面,我认为您不会找到更有效的解决方案,因为您需要一种方法来转换数据,使得值将成为您的密钥(然后最终将该数据转换回原始模式).