2016-03-29 14 views
0

特定のRDDは、例えばスパークに作成されます。スパークRDD持続性とパーティション

lines = sc.textFile("README.md") 

そして変換は、このRDDに呼び出されます。

pythonLines = lines.filter(lambda line: "Python" in line) 

あなたは、この上のアクションを呼び出す場合変換されたフィルタRDD(pythonlines.firstなど)an RDD will be recomputed ones again each time you run an action on themとはどういう意味ですか?元のRDDでfilter変換を呼び出した後に、textFileメソッドを使用して作成した元のRDDが保持されていないと考えました。それでちょうど最新の変換されたRDDを再計算します。この場合、フィルタ変換を使って作成したRDDです。私の前提が正しければ、それがなぜ必要なのかは本当に分かりません。

答えて

2

点火では、RDDはです。評価されています。あなたは単にあなたが結果を使用したことがないので、ファイルを読まずに終了します

lines = sc.textFile("README.md").map(xxx) 

あなたのプログラムを書く場合、これが意味しています。あなたは2つの異なる場所でそれを再利用しているのでlineLengthを持つために必要な計算は、二回を作らされます

linesLength = sc.textFile("README.md").map(line => line.split(" ").length) 
sumLinesLength = linesLength.reduce(_ + _) // <-- scala way 
maxLineLength = linesLength.max() 

:あなたのような何かを書く場合。それを避けるために、あなたは二つの異なる方法

linesLength = sc.textFile("README.md").map(line => line.split(" ").length) 
linesLength.persist() 
// ... 

で使用する前に、あなたの結果RDDを持続する必要がありますまた、https://spark.apache.org/docs/latest/programming-guide.html#rdd-persistenceを見てみることができます。私の説明があまりにも混乱ではないことを願っています!

+0

最後の行を呼び出した後、3行目を持っている2番目の例では、 'maxLineLength = linesLength.max()'を使って 'lineLength' RDDが消えてしまいます。ですから、あなたのプログラムの複数の場所でlinesLength RDDを使いたいならば、 'linesLength RDD'を使ってもアクセスできるように、それを永続化するべきです。正しい? – LP496

+1

基本的に、私の例ではlineLengthのような中間結果が複数回再利用されている場合は、persist()する必要があります。そうでなければsparkは数回も計算します。 RDDはデータではなく、「計算のリスト」です。ですから、 'linesLength.max()'と書くと、Sparkはあなたが以前に計算したものの最大値を理解することはできませんが、このファイルを読んでマップを実行することで得ることができるRDDの最大値* – christophetd

+0

Ok私は今、RDDが残業を再計算することを意味しているのを見ます。解明してくれてありがとう! – LP496

関連する問題