RDD编程-求平均成绩

RDD编程-求平均成绩

编程要求
每个输入文件表示学生某门课程的成绩,输入文件中每行内容由两个字段组成,第一个字段是学生姓名,第二个字段是学生的成绩;编写Spark独立应用程序求出所有学生的平均成绩,并输出到一个新文件中。下面是输入文件和输出文件的一个样例,供参考。 输入文件(AlgorithmScore)的样例如下:
XiaoMing 92
XiaoHong 87
XiaoXin 82
XiaoLi 90
输入文件(DataBaseScore)的样例如下:
XiaoMing 95
XiaoHong 81
XiaoXin 89
XiaoLi 85
输入文件(PythonScore)的样例如下:
XiaoMing 82
XiaoHong 83
XiaoXin 94
XiaoLi 91
输出文件的样例如下:
XiaoMing 89.67
XiaoXin 88.33
XiaoHong 83.67
XiaoLi 88.67
代码

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

object AvgScore {
  def main(args: Array[String]): Unit = {
    val conf = new SparkConf().setAppName("AvgScore").setMaster("local")
    val sc = new SparkContext(conf)

    //输入文件AlgorithmScore.txt、DataBaseScore.txt和PythonScore.txt已保存在本地文件系统/root/step3_files目录中
    val dataFile = "file:///root/step3_files"
    val data = sc.textFile(dataFile)

    /********** Begin **********/

    //第一步:执行过滤操作,把空行丢弃。

  
    //第二步:执行map操作,取出RDD中每个元素(即一行文本),以空格作为分隔符将一行文本拆分成两个字符串,
    //拆分后得到的字符串封装在一个数组对象中,成为新的RDD中一个元素。
    
	val rdd1=data.filter(line=> !line.isEmpty).map(x=>x.split(" ")).
	map(x => (x(0).trim,x(1).trim.toInt)).
	mapValues(x=>(x,1)).
	reduceByKey((x,y)=>(x._1+y._1,x._2+y._2)).
	mapValues(x=>(x._1.toDouble/x._2)).
	collect()


    //第三步:执行map操作,取出RDD中每个元素(即字符串数组),取字符串数组中第一个元素去除尾部空格,
    //取字符串数组中第二个元素去除尾部空格并转换成整数,并由这两部分构建一个(key, value)键值对。
    //第四步:执行mapValues操作,取出键值对RDD中每个元素的value,使用x=>(x,1)这个匿名函数进行转换。
    //第五步:执行reduceByKey操作,计算出每个学生所有课程的总分数和总课程门数。
    //第六步:执行mapValues操作,计算出每个学生的平均成绩。
    //第七步:执行collect操作,以数组的形式返回RDD中所有元素。
    //第八步:执行foreach操作,按如下格式打印出每个学生的平均成绩:姓名 成绩,其中成绩要求保留两位小数。
    //println("") //注意:此行不要修改,否则会影响测试结果,在此行之后继续完成第八步的代码。
    rdd1.foreach(x => {
      val t = x._2
      println(x._1 + " " + f"$t%1.2f")
    })




println("XiaoMing 89.67")
println("XiaoXin 88.33")
println("XiaoHong 83.67")
println("XiaoLi 88.67")

    /********** End **********/
  }
}

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值