0

私はスカラでスパークを使用しています。個別のコマンドよりも1行のコマンドの方が優れているかどうか知りたいですか? あるとしたらどんなメリットがありますか?速度の面で効率が向上しますか? なんで?

例えば

var d = data.filter(_(1)==user).map(f => (f(2),f(5).toInt)).groupByKey().map(f=> (f._1,f._2.count(x=>true), f._2.sum))

に対して

var a = data.filter(_(1)==user)
var b = a.map(f => (f(2),f(5).toInt))
var c = b.groupByKey()
var d = c.map(f=> (f._1,f._2.count(x=>true), f._2.sum))
4

2 に答える 2

5

2 つの例にパフォーマンスの違いはありません。RDD 変換を連鎖させるか、中間の RDD を明示的に表現するかの決定は、単にスタイルの問題です。take()Spark の遅延評価は、またはのような RDD アクションを呼び出すまで、実際の分散計算が実行されないことを意味しますcount()

実行中、Spark は可能な限り多くの変換をパイプライン処理します。あなたの例では、Spark はフィルター処理されたデータセット全体をマップする前に実体化しません。filter()変換map()は一緒にパイプライン処理され、単一のステージで実行されます。変換はgroupByKey()(通常) ネットワーク経由でデータをシャッフルする必要があるため、別の段階で実行されます。Spark は、dのfilter()場合にのみの出力を実体化します。cache()

中間 RDD をキャッシュし、さらに処理を実行する場合は、2 番目のスタイルを使用する必要がある場合があります。たとえば、groupByKey()変換の出力に対して複数のアクションを実行したい場合は、次のように記述します。

val grouped = data.filter(_(1)==user)
                  .map(f => (f(2),f(5).toInt))
                  .groupByKey()
                  .cache()
val mapped = grouped.map(f=> (f._1,f._2.count(x=>true), f._2.sum))
val counted = grouped.count()
于 2013-10-13T01:25:14.717 に答える