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

    推荐阅读