Spark RDDで要素の範囲を選択したい。たとえば、100個の要素を持つRDDがあり、60から80の要素を選択する必要がある場合。それを行う?
RDDには、最初のi要素を返すtake(i:int)メソッドがあることがわかります。しかし、最後のi個の要素、または特定のインデックスで始まる中央からi個の要素を取得するための対応するメソッドはありません。
データセットはどれくらいの大きさですか?あなたはあなたが必要なことをすることができるかもしれません:
data.take(80).drop(59)
これは非効率的と思われますが、小規模から中規模のデータでは機能するはずです。
これを別の方法で解決することは可能ですか?データの中から特定の範囲を正確に選択する場合はどうなりますか? takeSample
はあなたにより良いサービスを提供しますか?
以下は範囲を取得できるはずです。内部的にzipWithIndexがRDDパーティションをスキャンして各パーティションの要素数を取得する必要があるため、キャッシュによってオーバーヘッドが節約されることに注意してください。
scala>val r1 = sc.parallelize(List("a", "b", "c", "d", "e", "f", "g"), 3).cache
scala>val r2 = r1.zipWithIndex
scala>val r3 = r2.filter(x=> {x._2>2 && x._2 < 4}).map(x=>x._1)
scala>r3.foreach(println)
d
Spark 2.x互換の回答を探しているこの質問につまずいた人は、 filterByRange