Spark算子 - aggregate

釋義:

將每個partition內元素進行聚合,然後將每個partition的聚合結果進行combine,得到最終聚合結果。且最終結果允許跟原始RDD類型不同
方法簽名如下:

def aggregate[U: ClassTag](zeroValue: U)(seqOp: (U, T) => U, combOp: (U, U) => U): U = withScope {
  ...
}

案例:

統計所有單詞總長度,單詞的總個數

object TestAggregate {
  def main(args: Array[String]): Unit = {
    val spark: SparkSession = SparkSession.builder().appName("MyApp").master("local[1]").getOrCreate()
    val data = Array("hello", "world", "simple", "app", "is", "good", "good", "world")
    val result: (Int, Int) = spark.sparkContext.parallelize(data, 2) // 當前設置爲2個partition
      .aggregate((0, 0))( //①
        (v: (Int, Int), str: String) => (v._1 + str.length, v._2 + 1), // ②
        (v1: (Int, Int), v2: (Int, Int)) => (v1._1 + v2._1, v1._2 + v2._2) // ③
      )
    println(result)
  }
}

輸出:

(34,8)

解釋:

  1. 在每個partition內傳入初始值(0, 0),如①處
  2. 之後每個partition內開始進行聚合計算,如②處。每個partition內的單詞長度累加,放入結果二元組的第一位;每處理一個單詞,結果二元組的第二位加一,即單詞個數加一
  3. 每個partition的結果二元組再進行彙總操作,如③處。最終形成一個二元組,第一位是所有字母的總長度,第二位是所有單詞的總個數



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