RDD编程求最高分

一.问题

假设已知spark课程的学生成绩如下:

('stu01',90)

('stu02',91)

('stu03',88)

('stu04',96)

('stu05',98)

('stu06',95)

编程spark程序求解:

1、最高分的学生和分数;

2、这门课程的平均分。

二.思路

编程spark程序求解:

1、最高分的学生和分数;

首先使用spark提供的parallelize函数从集合中创建RDD,

然后使用rdd中的reduce函数(函数功能:将RDD中元素两两传递给输入函数,同时产生一个新的值,新产生的值与RDD中下一个元素再被传递给输入函数直到最后只有一个值为止。),代码为:

val result = rdd.reduce((x,y) => (if(x._2 < y._2) y else x))

得到了最高分的学生信息(姓名,分数)。

2、这门课程的平均分

思路:平均分=分数和/人数

分数和:使用累加器累加这些学生的分数获得,即emptyLineCount.value,其代码为:

val emptyLineCount: LongAccumulator = sc.longAccumulator

rdd.foreach(s => if (s._2 != 0) emptyLineCount.add(s._2))

人数:使用rdd.count()获得rdd的元素个数,也即学生的个数

平均分:val avg = emptyLineCount.value/rdd.count()

三.程序

 1 package com.bigdata.spark
 2 import org.apache.spark.{SparkConf, SparkContext}
 3 import org.apache.spark.util.LongAccumulator
 4 object WordCount {
 5   def main(args: Array[String]): Unit = {
 6     // 1. 创建 SparkConf对象, 并设置 App名字
 7     val conf: SparkConf = new SparkConf().setMaster("local[*]").setAppName("StuScore")
 8     // 2. 创建SparkContext对象
 9     val sc = new SparkContext(conf)
10 
11     val rdd = sc.parallelize(Array[(String,Int)](("stu01",90),("stu02",91),("stu03",88), ("stu04",96), ("stu05",98), ("stu06",95)))
12 
13     //val result1 = rdd.map(x => x._2).max
14     //val result2 = rdd.reduce((x,y) => ("result",(if(x._2 < y._2) y._2 else x._2)))
15     val result = rdd.reduce((x,y) => (if(x._2 < y._2) y else x))
16     println("最高分的学生信息(姓名,分数)为:"+result)
17 
18     //使用累加器累加这些学生的分数emptyLineCount.value
19     val emptyLineCount: LongAccumulator = sc.longAccumulator
20     rdd.foreach(s => if (s._2 != 0) emptyLineCount.add(s._2))
21     //rdd.count()获得学生的个数--也即rdd的元素个数
22     //println(rdd.count())
23     val avg = emptyLineCount.value/rdd.count()
24     println("这门课程的平均分为"+avg)
25   }
26 
27 }

posted @ 2020-04-20 01:05  saaas  阅读(330)  评论(0)    收藏  举报