任意のオブジェクトのRDDがあるとします。 RDDの10行目(たとえば)を取得したいと思います。どうすればいいですか? 1つの方法は、rdd.take(n)を使用してから、オブジェクトであるn番目の要素にアクセスすることですが、nが大きい場合、このアプローチは遅くなります。
Sparkのエンジンの現在および将来の最適化に依存するため、どれだけ効率的かはわかりませんが、次のことを試してみてください。
rdd.zipWithIndex.filter(_._2==9).map(_._1).first()
最初の関数は、RDDをペア(値、idx)に変換し、idxは0以降になります。 2番目の関数は、idx == 9(10番目)の要素を取ります。 3番目の関数は元の値を取ります。その後、結果が返されます。
first関数は、実行エンジンによってプルアップされ、処理全体の動作に影響を与える可能性があります。試してみる。
いずれにせよ、nが非常に大きいの場合、このメソッドは、の配列を収集する必要がないという点で効率的です。ドライバノードの最初のn要素。
膨大なデータについてはチェックしていません。しかし、それは私にとってはうまくいきます。
N = 2としましょう。2番目の要素にアクセスしたいのですが、
data.take(2).drop(1)
RDD.collect()
とRDD.take(x)
はどちらも、インデックス作成をサポートするリストを返します。したがって、位置Nに要素が必要になるたびに、次の2つのコードのいずれかを実行できます。位置Nに要素が必要な場合、RDD.collect()[N-1]
またはRDD.take(N)[N-1]
は正常に機能します。