釋義
reduceByKey
類似reduce
,但reduceByKey
是先根據key進行分組,再將每個組內的記錄歸併成1個記錄,最終返回一個PairRDD,k爲key類型,v爲每個組歸併後的記錄類型
方法簽名如下:
def reduceByKey(func: (V, V) => V): RDD[(K, V)] = self.withScope {
...
}
- func: 根據key分組後的每個組,組內進行歸併最終只有一個結果。輸入類型爲V跟V,輸出爲V,即輸入類型與輸出類型一致
案例1
統計單詞個數/wordcount
參考:https://www.cnblogs.com/convict/p/14828084.html
案例2
已知每個店的水果單價,求市場上每種水果的平均價格
object TestReduceByKey {
def main(args: Array[String]): Unit = {
val conf: SparkConf = new SparkConf().setAppName("TestReduceByKey").setMaster("local[1]")
val sc: SparkContext = new SparkContext(conf)
val data = Array(("Apple", 5.0), ("Apple", 5.5), ("Banana", 2.0), ("Pear", 2.0))
val result: Array[(String, Double)] = sc.parallelize(data)
.map(v => (v._1, (v._2, 1)))
.reduceByKey((v1, v2) => (v1._1 + v2._1, v1._2 + v2._2))
.map(v => (v._1, v._2._1 / v._2._2))
.collect()
result.foreach(println)
}
}
輸出
(Apple,5.25)
(Pear,2.0)
(Banana,2.0)
解釋
- 先map成新元組,即
(name, (price, 1))
- 調用reduceByKey後,此時v1與v2都是value值,即都是上一步的
(price, 1)
,此時同個key的組內price與price相加,1與1相加做爲數量和,最終形成(price之和, 數量之和)
的形式 - 對每個組的結果進行
price之和
除以數量之和
的操作,得出每個水果的均價