2017-09-28 57 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