2017-03-25 9 views
3

reduceByKey関数は、次のように定義されています。私が理解しようとしているのは、関数が入力として2つの値、すなわち(V, V) => Vを取るこの定義を読み込む方法です。 reduceByKeyがすべてに適用されているため理解reduceByKey関数定義スパークScalaの

def mapValues[U](f: (V) ⇒ U): RDD[(K, U)] 

これです:それだけの機能は、同一または異なるタイプの値であるUを得るために、値Vに適用されmapValues関数のように、V => Vすべきではありません一度に(同じキー用)の値、及びmapValuesが各値に適用される(かかわらず、キーの)それが(V1, V2) => V

答えて

6

ようなものとして定義されるべきではない場合には時間?1つの.. V => Vでなければならないでしょうか?mapValuesのように...

いいえ、それらは全く異なります。 map関数には不変式があり、元のリスト(マップされたもの)と同じlengthを持つIterableListArrayなど)が返されることを思い出してください。一方、reduce機能集約またはすべての要素を組み合わせた、reduceByKeyが適用される機能によって、ペアまたは値を組み合わせて、この場合には、この定義はmonoidと呼ばれる数学的概念から来ています。このようにして、リストの2つの最初の要素を適用された関数で結合し、その操作の結果(最初の要素と同じ型である必要があります。最終的には1つの要素しか持たない。

1

mapValuesはRDD適用Fで対の各第二の部分を変換する:reduceByKeyは一対適用Fに同じキーを持つすべてのペアを低減しながら、(V)Uは⇒(V、V)=> V

val data = Array((1,1),(1,2),(1,4),(3,5),(3,7)) 
val rdd = sc.parallelize(data) 
rdd.mapValues(x=>x+1).collect 
// Array((1,2),(1,3),(1,5),(3,6),(3,8)) 
rdd.reduceByKey(_+_).collect 
// Array((1,7),(3,12)) 
関連する問題