web-dev-qa-db-ja.com

Spark RDDのn番目の行を取得する方法は?

任意のオブジェクトのRDDがあるとします。 RDDの10行目(たとえば)を取得したいと思います。どうすればいいですか? 1つの方法は、rdd.take(n)を使用してから、オブジェクトであるn番目の要素にアクセスすることですが、nが大きい場合、このアプローチは遅くなります。

9
user1742188

Sparkのエンジンの現在および将来の最適化に依存するため、どれだけ効率的かはわかりませんが、次のことを試してみてください。

rdd.zipWithIndex.filter(_._2==9).map(_._1).first()

最初の関数は、RDDをペア(値、idx)に変換し、idxは0以降になります。 2番目の関数は、idx == 9(10番目)の要素を取ります。 3番目の関数は元の値を取ります。その後、結果が返されます。

first関数は、実行エンジンによってプルアップされ、処理全体の動作に影響を与える可能性があります。試してみる。

いずれにせよ、n非常に大きいの場合、このメソッドは、の配列を収集する必要がないという点で効率的です。ドライバノードの最初のn要素。

9
Nicola Ferraro

膨大なデータについてはチェックしていません。しかし、それは私にとってはうまくいきます。

N = 2としましょう。2番目の要素にアクセスしたいのですが、

   data.take(2).drop(1)
8
Jack Daniel

RDD.collect()RDD.take(x)はどちらも、インデックス作成をサポートするリストを返します。したがって、位置Nに要素が必要になるたびに、次の2つのコードのいずれかを実行できます。位置Nに要素が必要な場合、RDD.collect()[N-1]またはRDD.take(N)[N-1]は正常に機能します。

2
Neeraj Mehta