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

题目和答案:

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 算子 经典习题)