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
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值