有如下代碼,我們需要做wc統計
def main(args: Array[String]): Unit = {
val sparkConf = new SparkConf().setMaster("local[2]").setAppName("my-test")
val sc = new SparkContext(sparkConf)
val list = sc.parallelize(List("java,python,scala", "java,python,scala", "java,python,scala"),3)
val words = list.flatMap(_.split(","))
val pair = words.map(x=>(x,1))
val result = pair.reduceByKey(_+_)
sc.stop()
}
執行流程如下:
在reduceByKey
的時候,先會對數據進行預聚合,我們從源碼可以看到,reduceByKey最終走的方法是combineByKeyWithClassTag
,裏面的mapSideCombine
默認爲true
這裏可能會出現一個面試題:reduceByKey和groupByKey的區別?
我們看下groupByKey的源碼,裏面的mapSideCombine
爲false
所以reduceByKey和groupByKey的區別就是:reduceByKey
會進行預聚合,而groupByKey
不會進行預聚合