web-dev-qa-db-ja.com

Spark RDDで要素の範囲を選択するにはどうすればよいですか?

Spark RDDで要素の範囲を選択したい。たとえば、100個の要素を持つRDDがあり、60から80の要素を選択する必要がある場合。それを行う?

RDDには、最初のi要素を返すtake(i:int)メソッドがあることがわかります。しかし、最後のi個の要素、または特定のインデックスで始まる中央からi個の要素を取得するための対応するメソッドはありません。

24
PlinyTheElder

データセットはどれくらいの大きさですか?あなたはあなたが必要なことをすることができるかもしれません:

data.take(80).drop(59)

これは非効率的と思われますが、小規模から中規模のデータでは機能するはずです。

これを別の方法で解決することは可能ですか?データの中から特定の範囲を正確に選択する場合はどうなりますか? takeSampleはあなたにより良いサービスを提供しますか?

7
DPM

以下は範囲を取得できるはずです。内部的に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
5
zhang zhan

Spark 2.x互換の回答を探しているこの質問につまずいた人は、 filterByRange

0
jrook