釋義
根據RDD中的某個屬性進行分組,分組後形式爲(k, [v1, v2, ...])
方法簽名如下:
def groupByKey(): RDD[(K, Iterable[V])] = self.withScope {
...
}
案例
查看每個科目有哪些學生選擇
object TestGroupByKey {
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])] = sc.parallelize(data)
.groupByKey()
.collect()
result.foreach(println)
}
}
輸出
(Music,CompactBuffer(Nancy, Tony))
(Science,CompactBuffer(Jack, Tom))
(Sport,CompactBuffer(Tom))
解釋
- 根據key分組,即根據科目分組,分組後爲K-V型RDD,key爲科目,value爲元素是學生名字的
CompactBuffer
- 這是Spark定義的結構(源碼),類似於Scala原生的
ArrayBuffer
,但比後者性能更好 CompactBuffer
繼承自序列,因此它很容易的進行遍歷和迭代,可以把它理解成一個列表
- 這是Spark定義的結構(源碼),類似於Scala原生的
groupByKey
與groupBy
的最大區別就是前者計算後CompactBuffer
的元素沒有原始的key,而後者有