2016-06-28 4 views
1

私はsparkで解決しようとしていたこの問題をScalaに慣れていません。今までこのスカラー集計関数を2つの初期値で説明することができます

、私は唯一の私は、(一つだけ初期値で電子some-input.aggregate(Initial-value)((acc,value)=>(acc+value)))を集約関数を見てきましたが、このプログラムは2つの初期値(0,0)を持っている。

このプログラムは算出するものである私の理解あたりとして移動平均と、これまでのカウントを追跡する。

val result = input.aggregate((0, 0))(
       (acc, value) => (acc._1 + value, acc._2 + 1), 
       (acc1, acc2) => (acc1._1 + acc2._1, acc1._2 + acc2._2)) 
val avg = result._1/result._2.toDouble 

空のコレクションの場合には、我々は、デフォルト値を取得し、両方がアキュムレータと値を持つように私は、foldLeft/aggregateに、我々は初期値を指定することを知っています部分。

しかし、この場合、2つの初期値があり、アキュムレータはタプル値にアクセスしています。 このタプルはどこに定義されていますか

このプログラム全体を1行ずつ説明してください。

+0

:あなたがメソッドの定義を見てみると

、あなたはそれが最初の引数リスト内の単一のパラメータを取り表示されます(私はこれがRDD.aggregateであると仮定しています)あなたはすでにそこに単一の 'scala.Tuple2'値があることを知っています。 –

答えて

5

ただし、このプログラムには2つの初期値(0,0)があります。

彼らは、2つのパラメータではありません、彼らは1 Tuple2だ:

input.aggregate((0, 0)) 

aggregateに渡された値がTuple2.applyのためのシンタックスシュガーとして使用されている追加の丸括弧、(())に囲まれて。これはタプルが出現しているところです。私はあなたが必要なのですかわからないのです

def aggregate[U](zeroValue: U)(seqOp: (U, T) ⇒ U, combOp: (U, U) ⇒ U) 
       (implicit arg0: ClassTag[U]): U 
+0

@Sal追加の質問がある場合は、投稿が新鮮な質問であることをお勧めします。 –

関連する問題