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