Spark算子 - reduceByKey


釋義

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)

解釋

  1. 先map成新元組,即(name, (price, 1))
  2. 調用reduceByKey後,此時v1與v2都是value值,即都是上一步的(price, 1),此時同個key的組內price與price相加,1與1相加做爲數量和,最終形成(price之和, 數量之和) 的形式
  3. 對每個組的結果進行 price之和 除以 數量之和 的操作,得出每個水果的均價



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章