2017-09-28 8 views
0

注文後にRDDを返すにはどうしたらいいですか? 1つの値で注文し、トップの結果を得て、2番目の値で注文したいと思います。例えば ソート後の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も持っており、それが1つのステップで行うことができますか?

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

答えて

1

ような何か、私はそれはそれは小さなだ場合、そしてちょうどsorted機能付きドライバーでそれをソートし、もうそれを再配布する必要はありません、あなたが最初のステップで撮影したどのように多くの要素によって異なり推測:

にRDDを収集することはありませんあなたが最初のステップの要素の多くを取る手にした場合、あなたは、RDDのソートインデックスでそれを圧縮してから最初の数の要素を取るためにフィルタを使用することができます
sorted(res, key=lambda x: x[2]) 
# [(2, 'b', 9), (1, 'a', 10)] 

、タプルの3番目の要素に基づいてソートを続けることができます。

(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'は私がやろうとしていたもので動作します。ありがとうございます。 – jenesaisquoi

+0

ようこそ。うれしい! – Psidom

関連する問題