Spark算子 - groupBy



釋義

根據RDD中的某個屬性進行分組,分組后形式為(k, [(k, v1), (k, v2), ...]),即groupBy 后組內元素會保留key值
方法簽名如下:

def groupBy[K](f: T => K)(implicit kt: ClassTag[K]): RDD[(K, Iterable[T])] = withScope {
   ...
}

f: 分組操作。輸入類型為T,操作過程為K,最后RDD形式為K, 迭代器(T)的形式,即同上所述形式

案例

查看每個科目有哪些學生選擇

object TestGroupBy {
  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(("Science", "Jack"), ("Science", "Tom"), ("Music", "Nancy"), ("Sport", "Tom"), ("Music", "Tony"))
    val result: Array[(String, Iterable[(String, String)])] = sc.parallelize(data)
      .groupBy(v => v._1)
      .collect()
    result.foreach(println)
  }
}

輸出

(Music,CompactBuffer((Music,Nancy), (Music,Tony)))
(Science,CompactBuffer((Science,Jack), (Science,Tom)))
(Sport,CompactBuffer((Sport,Tom)))

解釋

  1. 根據v._1即名字進行分組,分組后key為名字,value為CompactBuffer
  • 這是Spark定義的結構(源碼),類似於Scala原生的ArrayBuffer,但比后者性能更好
  • CompactBuffer 繼承自序列,因此它很容易的進行遍歷和迭代,可以把它理解成一個列表
  1. 分組后,CompactBuffer 中的值會保留調用groupBy時的RDD格式




免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM