2017-09-28 59 views
0

如何在订购操作后返回RDD。我想按一个值排序,获得最高结果并按第二个值排序。Pyspark在排序后返回RDD

例如,

rdd = sc.parallelize([(1, "a", 10), (2, "b", 9), (3, "c", 8)]) 

res = rdd.takeOrdered(2, lambda x: x[0]) # sort on first value 
# sort on second value 
out = sc.parallelize(res).sortBy(lambda x: x[2]).collect() 

但是我可以有res是RDD并做一步到位?喜欢的东西

rdd.takeOrdered(2, lambda x: x[0])\ 
    .sortBy(lambda x: x[2]) 

回答

1

我想这取决于你有多少元素迈出了第一步,如果是小的,那么就没有必要再重新分配,正好与sorted功能的驱动程序对其进行排序:

sorted(res, key=lambda x: x[2]) 
# [(2, 'b', 9), (1, 'a', 10)] 

如果您的玉手,采取了很多在第一步中的元素,可以排序RDD,索引压缩,然后使用过滤器把前几个元素,这不收集RDD到驱动程序,您可以继续根据元组中的第三个元素对其进行排序:

(rdd.sortBy(lambda x: x[0]) 
    .zipWithIndex() 
    .filter(lambda x: x[1] <= 1) 
    .map(lambda x: x[0]) 
    .sortBy(lambda x: x[2]) 
).collect() 

# [(2, 'b', 9), (1, 'a', 10)] 
+0

啊,'zipWithIndex'适用于我想要做的事情。 Thankyou – jenesaisquoi

+0

不客气。很高兴帮助! – Psidom