Spark算子 - aggregateByKey

释义:

  1. aggregateByKey逻辑类似 aggregate,但 aggregateByKey针对的是PairRDD,即键值对 RDD,所以返回结果也是 PairRDD,结果形式为:(各个Key, 同样Key对应的Value聚合后的值)。
  2. aggregateByKey先将每个partition内元素进行分组计算,然后将每个partition的计算结果进行combine,得到最终聚合结果。且最终结果允许跟原始RDD类型不同
    方法签名如下:
def aggregateByKey[U: ClassTag](zeroValue: U)(seqOp: (U, V) => U, combOp: (U, U) => U): RDD[(K, U)] = self.withScope {
    ...
}

案例:

统计单词个数 WordCount

object TestAggregateByKey {
  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: Array[(String, Int)] = spark.sparkContext.parallelize(data, 1)
      .flatMap(_.split(" "))
      .map((_, 1))
      .aggregateByKey(0)(
        (cnt1: Int, cnt2: Int) => cnt1 + cnt2,
        (partitionAllCnt1: Int, partitionAllCnt2: Int) => partitionAllCnt1 + partitionAllCnt2
      )
      .collect()
    result.foreach(println)
  }
}

输出:

(is,1)
(app,1)
(simple,1)
(hello,1)
(good,2)
(world,2)

解释:

  1. 先将每个词map成 (词语, 1)的形式
  2. 调用aggregateByKey之后,每个partition内已经按key进行分组了,之后传入初始值0作为每个组的个数,接着进行 cnt1 + cnt2,就是同个key内进行1+1操作,比如单词good 有两个value都是1,此时单词good的组内,计算的值即为2
  3. 所有partition的结果进行计算



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