2017-06-21 11 views
0

take(count)は、最初のcountという項目を持つ配列を返すRDDのアクションです。RDDを変換する 'take'

最初にcountの項目を含むRDDを返す変換はありますか?私は、データがドライバに転送したくない :

(カウントは概算であればそれはOKです)、私は得ることができる最高は

val countPerPartition = count/rdd.getNumPartitions.toDouble 
rdd.mapPartitions(_.take(countPerPartition)) 

更新です。私の場合、countはかなり大きく、ドライバはそれを保持するのに十分なメモリがありません。さらなる変換のためにデータをパラレル化したままにしておきたい。

+0

あなたは 'sample'を使うことができますが、それはrdd特定の数よりもむしろ。 – puhlen

+0

'sample'はどれくらいの費用がかかりますか?それは1000番目のアイテムを取得するために高価な場合は、それはまた、高価でしょうか? – ov7a

+0

私はそれを前に使っていませんが、それはかなり安いはずです。特に置換えなしでサンプルすると、それほど多くの作業はありません。 – puhlen

答えて

1

rdd.map(..)。take(X)にしないでください。私。変換し、次に取る。あなたが呼び出すまで、冗長な作業をするのを恐れることはありません。すべての計算が怠惰で評価されます(したがって、〜X変換だけが起こります)。

+0

takeの後に.mapPartitions()を使用する場合はどうすればよいですか? データを並列化したままにしたい場合はどうすればよいですか? – ov7a

+0

takeはアクション(すなわち計算チェーンの終わり)であり、それはまたデータをドライバに持ち込むので、結果としてオブジェクトのリストだけを得るでしょう。 あなたは、次の操作を行うことができます: ヴァル変換= rdd.map(...)を ヴァルます。myList = transformed.take(X) ヴァルwithMapPartition = transformed.mapPartitions(...) –

+0

ポイントがある - 私はしないでくださいドライバーにデータを持ちたい。私はそれを強調するために投稿を編集しました。 – ov7a

関連する問題