spark的RDD练习--求学生的成绩

数据:

班级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
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 70

要求:

需求如下:
1.一共有多少人参加考试?
2.一共有多少个小于20岁的人参加考试?
3.一共有多少个等于20岁的人参加考试?
4.一共有多少个大于20岁的人参加考试?
===========================================
1.一共有多个男生参加考试?
2.一共有多少个女生参加考试?
3.12班有多少人参加考试?
4.13班有多少人参加考试?
===========================================
1.语文科目的平均成绩是多少?
2.数学科目的平均成绩是多少?
3.英语科目的平均成绩是多少?
===========================================
1.单个人平均成绩是多少?
===========================================
1.12班平均成绩是多少?
2.12班男生平均总成绩是多少?
3.12班女生平均总成绩是多少?
===========================================
1.全校语文成绩最高分是多少?
2.12班语文成绩最低分是多少?
3.13班数学最高成绩是多少?
===========================================
4.总成绩大于150分的12班的女生有几个?
package com.web.homework

import org.apache.spark.{SparkConf, SparkContext}

object HomeWork2 {

  case class ScoreTable(classId: Int, name: String, age: Int, sex: String, course: String, score: Double)

  def main(args: Array[String]): Unit = {
    /**
      * 初始化RDD,并整理数据集
      */
    val conf = new SparkConf().setMaster("local").setAppName("HomeWork")
    val sc = new SparkContext(conf)
    val filePath = "C:\\Users\\Administrator\\Desktop\\dataset.txt"
    val input = sc.textFile(filePath)
    val header = input.take(1)
    val table = input.filter(!header.contains(_))
    val file = table.map(line => {
      val fields = line.split(" ")
      val table = ScoreTable(fields(0).toInt, fields(1), fields(2).toInt, fields(3), fields(4), fields(5).toDouble)
      table
    }).cache()
    file.foreach(println)

    /**
      * 1.一共有多少人参加考试?
      * 2.一共有多少个小于20岁的人参加考试?
      * 3.一共有多少个等于20岁的人参加考试?
      * 4.一共有多少个大于20岁的人参加考试?
      */
    val nums1 = file.map(_.name).distinct().count()
    val nums2 = file.filter(_.age < 20).map(x => (x.name, x.age)).distinct().count()
    val nums3 = file.filter(_.age == 20).map(x => (x.name, x.age)).distinct().count()
    val nums4 = file.filter(_.age > 20).map(x => (x.name, x.age)).distinct().count()
    println("一共有" + nums1 + "人参加考试")
    println("一共有" + nums2 + "个小于20岁的人参加考试")
    println("一共有" + nums3 + "个等于20岁的人参加考试")
    println("一共有" + nums4 + "个大于20岁的人参加考试")

    /**
      * 1.一共有多个男生参加考试?
      * 2.一共有多少个女生参加考试?
      * 3.12班有多少人参加考试?
      * 4.13班有多少人参加考试?
      */
    val nums5 = file.filter(_.sex == "男").map(x => (x.name, x.sex)).distinct().count()
    val nums6 = file.filter(_.sex == "女").map(x => (x.name, x.sex)).distinct().count()
    val nums7 = file.filter(_.classId == 12).map(x => (x.name, x.sex)).distinct().count()
    val nums8 = file.filter(_.classId == 13).map(x => (x.name, x.sex)).distinct().count()
    println("一共有" + nums5 + "男生参加考试")
    println("一共有" + nums6 + "女生参加考试")
    println("12班有" + nums7 + "人参加考试")
    println("13班有" + nums8 + "人参加考试")

    /**
      * 1.语文科目的平均成绩是多少?
      * 2.数学科目的平均成绩是多少?
      * 3.英语科目的平均成绩是多少?
      */
    val nums9 = file.map(x => (x.course, (1, x.score)))
      .reduceByKey((v1, v2) => (v1._1 + v2._1, v1._2 + v2._2))
      .map(x => (x._1, (x._2._2 / x._2._1).formatted("%.2f")))
    nums9.collect().foreach(x => {
      x._1 match {
        case "math" => println("数学的平均值为:" + x._2)
        case "chinese" => println("数学的平均值为:" + x._2)
        case "english" => println("数学的平均值为:" + x._2)
      }
    })

    /**
      * 1.单个人平均成绩是多少?
      */
    val nums10 = file.map(x => (x.name, (1, x.score)))
      .reduceByKey((v1, v2) => (v1._1 + v2._1, v1._2 + v2._2))
      .map(x => (x._1, (x._2._2 / x._2._1).formatted("%.2f")))
    nums10.collect().foreach(x => {
      x._1 match {
        case "张三" => println("张三的平均分为:" + x._2)
        case "李四" => println("李四的平均分为:" + x._2)
        case "王芳" => println("王芳的平均分为:" + x._2)
        case "张大三" => println("张大三的平均分为:" + x._2)
        case "李大四" => println("李大四的平均分为:" + x._2)
        case "王小芳" => println("王小芳的平均分为:" + x._2)
      }
    })

    /**
      * 1.12班平均成绩是多少?
      * 2.12班男生平均总成绩是多少?
      * 3.12班女生平均总成绩是多少?
      */
    val nums11 = file.filter(_.classId == 12).map(x => (x.sex, (1, x.score)))
      .reduceByKey((v1, v2) => (v1._1 + v2._1, v1._2 + v2._2))
      .map(x => (x._1, (x._2._2 / x._2._1).formatted("%.2f")))
    val nums12 = file.filter(_.classId == 12).map(x => (x.classId, (1, x.score)))
      .reduceByKey((v1, v2) => (v1._1 + v2._1, v1._2 + v2._2))
      .map(x => (x._1, (x._2._2 / x._2._1).formatted("%.2f")))
    nums12.collect().foreach(x => println("12班的平均成绩为:" + x._2))
    nums11.collect().foreach(x => {
      x._1 match {
        case "男" => println("12班男生的平均成绩为:" + x._2)
        case "女" => println("12办女生平均成绩为:" + x._2)
      }
    })

    /**
      * 1.全校语文成绩最高分是多少?
      * 2.12班语文成绩最低分是多少?
      * 3.13班数学最高成绩是多少?
      */
    val nums13 = file.filter(_.course == "chinese").map(x => (x.course, x.score)).groupByKey().map(_._2.max)
    val nums14 = file.filter(_.classId == 12).filter(_.course == "chinese")
      .map(x => (x.course, x.score)).groupByKey().map(_._2.min)
    val nums15 = file.filter(_.classId == 13).filter(_.course == "math")
      .map(x => (x.course, x.score)).groupByKey().map(_._2.max)
    nums13.collect().foreach(x => println("全校语文成绩最高分为:" + x))
    nums14.collect().foreach(x => println("12班语文成绩最低分为:" + x))
    nums15.collect().foreach(x => println("13班数学成绩最高分为:" + x))

    /**
      * 4.总成绩大于150分的12班的女生有几个?
      */
    val nums16 = file.filter(_.classId == 12).filter(_.sex == "女").map(x => (x.name, x.score))
      .reduceByKey(_ + _).filter(_._2 >= 150).count()
    println("总成绩大于150分的12班的女生有:" + nums16 + "个")
    sc.stop()
  }
}

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值