版权声明:本文为博主原创文章,未经博主允许不得转载!!
欢迎访问:https://blog.csdn.net/qq_21439395/article/details/81023400
交流QQ: 824203453
给定数据,城市和温度的数据, 求每个城市的平均温度值。
数据如下:
val d1 = Array(("bj", 28.1), ("sh", 28.7), ("gz", 32.0), ("sz", 33.1))
val d2 = Array(("bj", 27.3), ("sh", 30.1), ("gz", 33.3))
val d3 = Array(("bj", 28.2), ("sh", 29.1), ("gz", 32.0), ("sz", 30.5))
思路:
1,对数据进行合并
2,按照城市进行分组
3,分组后进行聚合统计
1,对数据进行合并的实现:
使用 ++ 或者 union
val data: Array[(String, Double)] = d1 ++ d2 ++ d3
// val data = d1 union d2 union d3
2,按照城市进行分组
val grouped: Map[String, Array[(String, Double)]] = data.groupBy(_._1)
聚合实现方式一:
利用mapvalues算子,分别统计总的温度,以及月份的次数,然后求得平均温度
val result = grouped.mapValues(t => {
val totalSum = t.map(_._2).sum
val len = t.length
totalSum / len
})
result.foreach(println)
聚合实现方式二:
利用foldLeft来实现,需要注意的是,因为初始值类型是Double,而元素类型是元组类型,所以这里不能用fold实现
grouped.mapValues(t=>{
val sum = t.foldLeft(0d)(_+_._2)
sum / t.length
})
// .foreach(println)
聚合实现方式三:
利用reduce或者reduceLeft 实现。因为reduce和reduceLeft的特性,这里的元素是元组类型,要求返回值类型也得是元组类型。所以,需要组装成元组,再取第二个元素。即为温度总值。然后再除以长度,得到结果值。
grouped.mapValues(t=>{
t.reduceLeft((a,b)=>("",a._2 + b._2))._2 / t.length
})
.foreach(println)
聚合实现方式四:
利用aggregate实现。同样需要传递一个Double类型的初始值,然后进行统计计算。
grouped.mapValues(t=>{
t.aggregate(0d)(_+_._2,_+_) / t.length
})
结果值:
(gz,32.43333333333333)
(bj,27.86666666666667)
(sz,31.8)
(sh,29.3)
版权声明:本文为博主原创文章,未经博主允许不得转载!!
欢迎访问:https://blog.csdn.net/qq_21439395/article/details/81023400
交流QQ: 824203453