2016-03-30 10 views
4

複数のテキスト行を含むテキストファイルsherlock.txtがあります。フラットマップ対マップの効率とそれに続くスパークの削減

val textFile = sc.textFile("sherlock.txt") 

私の目的は、ファイル内の単語の数を数えることです。私は仕事をするための2つの代替方法に出くわしました。低減続いマップ使用

textFile.flatMap(line => line.split(" ")).count() 

セカンド:

flatMapを用いて第1

textFile.map(line => line.split(" ").size).reduce((a, b) => a + b) 

両方が正しく同じ結果をもたらします。私は上記の2つの代替実装の時間と空間の複雑さの違いを知りたいと思います。

scalaインタプリタは、両方を最も効率的な形式に変換しますか?

答えて

5

私はこれを処理する最も慣用的な方法はmapsumになるだろうと主張するだろう:

textFile.map(_.split(" ").size).sum 

が、総コストはline.split(" ")によって支配される一日の終わり。

Arrayを構築する代わりに、手動で文字列を繰り返して連続する空白を数えることで、少し上手くいくかもしれませんが、一般的にはそれほど価値はないと思います。

あなたは少し深い洞察count is defined as希望する場合:

def count(): Long = sc.runJob(this, Utils.getIteratorSize _).sum 

Utils.getIteratorSizeはかなりのものの合計とIteratorオーバーナイーブ反復であるとsum is equivalent to

_.fold(0.0)(_ + _) 
関連する問題