scala map reduce 思想

1. map

val v = Vector(1, 2, 3, 4)
val v2 = v.map(n => n * 2)
 

scala> val v = Vector(1, 2, 3, 4)
v: scala.collection.immutable.Vector[Int] = Vector(1, 2, 3, 4)

scala> val v2 = v.map(n => n * 2)
v2: scala.collection.immutable.Vector[Int] = Vector(2, 4, 6, 8)

map这个单词在这里不是地图的意思,而是映射、关联,将源容器中的元素经过函数处理后一一映射到新容器中。上面代码中执行的函数就是乘以2的匿名函数,我们可以自己定义成其他函数,加2啊,乘5啊,平方啊,等等。

2. reduce

val v = Vector(1, 2, 3, 4)
val v3 = v.reduce((sum, n) => sum + n)

很多例子写 v.reduce((a, b) => a + b) 便不好理解,其实是传入2个值,处理后,再跟下一个值传入,直到所有的都处理完。reduce也不是减少的意思,而是归纳、简化的意思,具体讲是把容器中的元素作参数传给里面的二元匿名函数,我的理解是实际上是个尾递归函数。

3. 具体例子

求一个文件中的平均年龄

1 54
2 69
3 66
4 33
5 18
6 51
7 82
8 26
9 1
格式是这样的。

import org.apache.spark.SparkConf
import org.apache.spark.SparkContext



object AvgAgeCalculator {
  def main(args: Array[String]): Unit = {
       val conf = new SparkConf().setAppName("Spark Exercise:Average Age Calculator")
       val sc = new SparkContext(conf)
       val dataFile = sc.textFile("file:///Users/walle/Documents/spark_projects/sparkage/sample_age_data.txt", 5);

       val count = dataFile.count()
       //文件是对一行处理,这里对空格进行分割得到第二个,scala数组中是用()根据下标取元素
       val ageData = dataFile.map(line => line.split(" ")(1))
       //求和
       val totalAge = ageData.map(age => Integer.parseInt( String.valueOf(age))).collect().reduce((a, b) => a + b)
       val avgAge : Double = totalAge.toDouble / count.toDouble
       println("Average Age is " + avgAge)
  }

}
 

参考文章:

http://www.codeblogbt.com/archives/148029

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

瓦力冫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值