¿Cómo ordenar de manera eficiente en PySpark?

Quiero ordenar mis tuplas K, V por V, es decir, por el valor. Sé que TakeOrdered es bueno para esto si sabes cuántos necesitas:

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

Utilizando TakeOrdered:

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

Usando Lambda

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

He comprobado la pregunta aquí , que sugiere lo último. Me resulta difícil creer que takeOrdered sea ​​tan breve y, sin embargo, requiera la misma cantidad de operaciones que la solución Lambda .

¿Alguien sabe de una Transformación en chispa más simple y concisa para ordenar por valor?

Creo que sortBy() es más conciso:

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

En realidad, no es más eficiente en absoluto, ya que implica la clave por los valores, la clasificación por teclas y luego la captura de los valores, pero se ve más bonita que su última solución. En términos de eficiencia, no creo que encuentre una solución más eficiente, ya que necesitaría una forma de transformar sus datos de modo que los valores sean sus claves (y luego, eventualmente, transformar esos datos al esquema original).