Spark算子 - reduceByKey
释义
reduceByKey
类似reduce
,但reduceByKey
是先根据key进行分组,再将每个组内的记录归并成1个记录,最终返回一个PairRDD,k为key类型,v为每个组归并后的记录类型
方法签名如下:
def reduceByKey(func: (V, V) => V): RDD[(K, V)] = self.withScope {
...
}
- func: 根据key分组后的每个组,组内进行归并最终只有一个结果。输入类型为V跟V,输出为V,即输入类型与输出类型一致
案例1
统计单词个数/wordcount
参考:https://www.cnblogs.com/convict/p/14828084.html
案例2
已知市场上每个店的销售的水果及单价,求市场上每种水果的平均价格
object TestReduceByKey {
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(("Apple", 5.0), ("Apple", 5.5), ("Banana", 2.0), ("Pear", 2.0))
val result: Array[(String, Double)] = sc.parallelize(data)
.map(v => (v._1, (v._2, 1)))
.reduceByKey((v1, v2) => (v1._1 + v2._1, v1._2 + v2._2))
.map(v => (v._1, v._2._1 / v._2._2))
.collect()
result.foreach(println)
}
}
输出
(Apple,5.25)
(Pear,2.0)
(Banana,2.0)
解释
- 先map成新元组,即
(name, (price, 1))
- 调用reduceByKey后,此时v1与v2都是value值,即都是上一步的
(price, 1)
,此时同个key的组内price与price相加,1与1相加做为数量和,最终形成(price之和, 数量之和)
的形式 - 对每个组的结果进行
price之和
除以数量之和
的操作,得出每个水果的均价