2017-04-19 1 views

答えて

0

combineByKeyより一般的にはaggregateByKeyです。実際には、aggregateByKey,reduceByKeyおよびgroupByKeyの実装は、combineByKeyによって実現されます。 aggregateByKeyreduceByKeyと似ていますが、集計を実行するときに初期値を指定できます。

名前のとおり、aggregateByKeyは、キーの集計、sum、avgなどの集計に適しています。ここでのルールは、マップ側の結合に費やされる余計な計算によって、他のノードと運転手。 funcがこのルールを満たしている場合は、おそらくaggregateByKeyを使用する必要があります。

combineByKeyが一般的です。マップ側の組み合わせを実行するかどうかを柔軟に指定できます。ただし、使用する方がより複雑です。少なくとも、3つの関数、すなわちcreateCombiner,mergeValue,mergeCombinersを実装する必要があります。

1

aggregateByKeyは、最初のアキュムレータ、アキュムレータに値をマージする第1のラムダ関数、2つのアキュムレータをマージする第2のラムダ関数を取ります。

combineByKeyは、より一般的であり、ここでは例として、最初のアキュムレータ

を作成するには、最初のラムダ関数を追加します。

val pairs = sc.parallelize(List(("prova", 1), ("ciao", 2), 
           ("prova", 2), ("ciao", 4), 
           ("prova", 3), ("ciao", 6))) 

pairs.aggregateByKey(List[Any]())(
    (aggr, value) => aggr ::: (value :: Nil), 
    (aggr1, aggr2) => aggr1 ::: aggr2 
).collect().toMap 

pairs.combineByKey(
    (value) => List(value), 
    (aggr: List[Any], value) => aggr ::: (value :: Nil), 
    (aggr1: List[Any], aggr2: List[Any]) => aggr1 ::: aggr2 
).collect().toMap 
関連する問題