Spark|Spark 算子 经典习题
数据:
班级 ID 姓名 年龄 性别 科目 成绩
12 张三 25 男 chinese 50
12 张三 25 男 math 60
12 张三 25 男 english 70
12 李四 20 男 chinese 50
12 李四 20 男 math 50
12 李四 20 男 english 50
12 王芳 19 女 chinese 70
12 王芳 19 女 math 70
12 王芳 19 女 english 70
12 小蔡 19 女 chinese 70
12 小蔡 19 女 math 100
12 小蔡 19 女 english 70
13 张大三 25 男 chinese 60
13 张大三 25 男 math 60
13 张大三 25 男 english 70
13 李大四 20 男 chinese 50
13 李大四 20 男 math 60
13 李大四 20 男 english 50
13 王小芳 19 女 chinese 70
13 王小芳 19 女 math 80
13 王小芳 19 女 english 7
【Spark|Spark 算子 经典习题】题目和答案:
val conf = new SparkConf()
conf.setMaster("local[2]").setAppName("1")
val sc = new SparkContext(conf)
val rdd = sc.textFile("D:\\ideaWorkspace\\myscala1\\src\\input\\a.txt")
val mapRDD = rdd.map(x=>x.split(" "))
val cacheRDD = mapRDD.cache()
- 一共有多少人参加考试
val num = rdd.map(x=>x.split("\\s+")(1)).distinct().count()
- 一共有多少个小于 20 岁的人参加考试
val num1 = cacheRDD.map(x=>(x(1),x(2))).filter(x=>x._2.toInt<25).distinct().count()
- 一共有多少个等于 20 岁的人参加考试?
val num2 = cacheRDD.map(x=>(x(1),x(2))).filter(x=>x._2.toInt==20).distinct().count()
- 一共有多少个大于 20 岁的人参加考试?
val num3 = cacheRDD.map(x=>(x(1),x(2))).filter(x=>x._2.toInt>20).distinct().count()
- 一共有多个男生参加考试
val num4 = cacheRDD.map(x=>(x(1),x(3))).filter(x=>x._2.equals("男")).distinct().count()
- 一共有多少个女生参加考试
val num5 = cacheRDD.map(x=>(x(1),x(3))).filter(x=>x._2.equals("女")).distinct().count()
- 12 班有多少人参加考试
val num6 = cacheRDD.map(x=>(x(0),x(1))).filter(x=>x._1.toInt==12).distinct().count()
- 13 班有多少人参加考试?
val num7 = cacheRDD.map(x=>(x(0),x(1))).filter(x=>x._1.toInt==13).distinct().count()
- 语文科目的平均成绩是多少?
val tuple = cacheRDD.map(x => (x(4), x(5), 1)).filter(x => x._1.equals("chinese")).map(x => (x._2.toInt, x._3)).reduce((x, y) => (x._1 + y._1, x._2 + y._2))
println(tuple._1 / tuple._2.toDouble)
- 数学科目的平均成绩是多少?
val tuple2 = cacheRDD.map(x => (x(4), x(5), 1)).filter(x => x._1.equals("math")).map(x => (x._2.toInt, x._3)).reduce((x, y) => (x._1 + y._1, x._2 + y._2))
println(tuple2._1 / tuple2._2.toDouble)
- 英语科目的平均成绩是多少?
val tuple3 = cacheRDD.map(x => (x(4), x(5), 1)).filter(x => x._1.equals("english")).map(x => (x._2.toInt, x._3)).reduce((x, y) => (x._1 + y._1, x._2 + y._2))
println(tuple3._1 / tuple3._2.toDouble)
- 个人平均成绩是多少
- 解法1:
val r1 = cacheRDD.map(x=>(x(1),1)).reduceByKey(_+_)
val r2 = cacheRDD.map(x=>(x(1),(x(5).toInt))).reduceByKey(_+_)
r2.join(r1).map(x=>(x._1,x._2._1/x._2._2.toDouble))
- 解法2:
cacheRDD.map(x=>(x(1),((x(5).toInt),1))).reduceByKey((x,y)=>(x._1+y._1,x._2+y._2)).map(x=>(x._1,x._2._1/x._2._2.toDouble)).collect()
- 12 班平均成绩是多少
cacheRDD.map(x=>(x(0),(x(5).toInt,1))).reduceByKey((x,y)=>(x._1+y._1,x._2+y._2)).filter(x=>x._1.toInt==12).map(x=>(x._1,x._2._1/x._2._2.toDouble))
- 12 班男生平均总成绩是多少
cacheRDD.map(x=>(x(0),(x(5).toInt,1,x(3)))).filter(x=>x._1.toInt==12).filter(x=>x._2._3.equals("男")).reduceByKey((x,y)=>(x._1+y._1,x._2+y._2,x._3)).map(x=>(x._1,x._2._3,x._2._1/x._2._2.toDouble))
- 12 班女生平均总成绩是多少?
cacheRDD.map(x=>(x(0),(x(5).toInt,1,x(3)))).filter(x=>x._1.toInt==12).filter(x=>x._2._3.equals("女")).reduceByKey((x,y)=>(x._1+y._1,x._2+y._2,x._3)).map(x=>(x._1,x._2._3,x._2._1/x._2._2.toDouble))
- 全校语文成绩最高分是多少
cacheRDD.map(x=>(x(4),x(5))).filter(x=>x._1.equals("chinese")).sortBy(x=>x._2.toInt,false).first()._2
- 12 班语文成绩最低分是多少?
cacheRDD.map(x=>(x(4),x(0),x(5))).filter(x=>x._1.equals("chinese") && x._2.toInt==12).sortBy(x=>x._3.toInt,true).take(1).foreach(x=>println(x._3))
- 13 班数学最高成绩是多少
cacheRDD.map(x=>(x(4),x(0),x(5))).filter(x=>x._1.equals("math") && x._2.toInt==13).sortBy(x=>x._3.toInt,false).take(1).foreach(x=>println(x._3))
- 总成绩大于 150 分的 12 班的女生有几个?
cacheRDD.map(x=>(x(0),x(1),x(3),x(5))).filter(x=>x._1.toInt ==12&&x._3.equals("女")).map(x=>(x._2,x._4.toInt)).reduceByKey(_.toInt+_.toInt).filter(x=>x._2.toInt>150).count()
- 总成绩大于150分,且数学大于等于70,且年龄大于等于19岁的学生的平均成绩是多少
//1.求出数学大于等于70,且年龄大于等于19岁的学生
val mathRDD = cacheRDD.map(x => (x(1), x(2), x(4), x(5))).filter(x => x._2.toInt >= 19 && x._3.equals("math") && x._4.toInt >= 70).map(x=>(x._1,1))
//2.求出成绩大于150的学生
val sumRDD = cacheRDD.map(x => (x(1),x(5).toInt)).reduceByKey(_+_).filter(x=>x._2>150).distinct()
//join之后,求出人数和分数和
val t1 = mathRDD.join(sumRDD).map(x=>(x._2._1,x._2._2)).reduce((x,y)=>(x._1+y._1,x._2+y._2))
//得到平均分
val avg = t1._2/t1._1.toDouble
推荐阅读
- Spark|Spark 数据倾斜及其解决方案
- 这份史上最经典的3大学习方法,清华北大学霸都在用!
- 我们为什么喜欢看《古惑仔》,它到底经典在哪()
- 经典的白色西装太吸睛了!李沁baby赵薇穿出颜值巅峰,这也太好看
- 我们都知道一片冰心在玉壶,其实古人这首诗写的”冰心“同样经典
- 鲁迅先生的经典语录
- 家教经典之四|家教经典之四|好孩子的成长99%靠妈妈
- 迫害我们心中的经典,以翻拍的方式
- 我用怀旧来怀念那些经典
- 漳州育心经典进泥之家第272期学经班活动精彩回顾