大数据学习-Scala
* scala是对java语言的封装,scala中的异常类实际上就是java中的异常
* Error
* Exception
* - 编译时期异常
* - 运行时期异常 RuntimeException
* 面向对象编程思想:是将对象传来传去的
* 1、将对象作为方法的参数进行传递
* 2、将对象作为方法的返回值类型进行返回
* 需要明确的是对象的类,抽象类或者接口的类型,可以使用多态进行传递或者返回
*
* 函数式编程思想:将函数传来传去
* 1、将函数A作为函数B的参数进行传递 必须要熟练掌握的
* 2、将函数A作为函数B的返回值类型 必须要能够看懂即可
* 需要明确的是函数的类型 -- 主要是由参数列表和返回值类型决定的
* 使用scala语法描述一个函数类型:
* 举例:String => Int
val f1: String => Int = (s: String) => s.toInt + 22
fun("11", f1)
fun("22", (s: String) => s.toInt + 100)
fun("22", s => s.toInt)
fun("22", _.toInt)
package com.shujia.jichu
import java.sql.{Connection, DriverManager, PreparedStatement, ResultSet}
object Demo20JDBC {
def main(args: Array[String]): Unit = {
Class.forName("com.mysql.jdbc.Driver")
val conn: Connection = DriverManager.getConnection("jdbc:mysql://192.168.220.100/studentdb?useUnicode=true&characterEncoding=utf8&useSSL=false", "root", "123456")
val state: PreparedStatement = conn.prepareStatement("select id,name,age,gender,clazz from student where clazz=?")
state.setString(1,"文科一班")
val resultSet: ResultSet = state.executeQuery()
while (resultSet.next()){
val id: Int = resultSet.getInt("id")
val name: String = resultSet.getString("name")
val age: Int = resultSet.getInt("age")
val gender: String = resultSet.getString("gender")
val clazz: String = resultSet.getString("clazz")
println(s"学号:${id},姓名:${name},年龄:${age},性别:${gender},班级:${clazz}")
}
state.close()
conn.close()
}
}
* 统计班级人数 [班级,人数]
* 统计学生的总分 [学号,学生姓名,学生年龄,总分]
* 1、统计年级排名前十学生各科的分数 [学号, 姓名,班级,科目,分数]
* 2、统计总分大于年级平均分的学生 [学号,姓名,班级,总分]
* 3、统计每科都及格的学生 [学号,姓名,班级,科目,分数]
* 4、统计每个班级的前三名 [学号,姓名,班级,分数]
* 5、统计偏科最严重的前100名学生 [学号,姓名,班级,科目,分数]
package com.shujia.zuoye
import scala.io.{BufferedSource, Source}
object HomeWork {
private case class Student(id: String, name: String, age: Int, gender: String, clazz: String)
private case class Score(id: String, subject_id: String, score: Int)
private case class Subject(subject_id: String, subject_name: String, subject_score: Int)
private var stuList: List[Student] = _
private var scoreList: List[Score] = _
private var subjectList: List[Subject] = _
private var stuInfoMap: Map[String, String] = _
private var subNameMap: Map[String, String] = _
private var subScoreMap: Map[String, Int] = _
private def loadData(): Unit = {
val stuBS: BufferedSource = Source.fromFile("scala/data/students.csv")
stuList = stuBS.getLines()
.toList
.map((s: String) => {
val strings: Array[String] = s.split(",")
val id: String = strings(0)
val name: String = strings(1)
val age: Int = strings(2).toInt
val gender: String = strings(3)
val clazz: String = strings(4)
Student(id, name, age, gender, clazz)
})
stuInfoMap = stuList.map((stu: Student) => (stu.id, stu.name + "," + stu.clazz)).toMap
val scoreBS: BufferedSource = Source.fromFile("scala/data/score.txt")
scoreList = scoreBS.getLines()
.toList
.map((s: String) => {
val strings: Array[String] = s.split(",")
val id: String = strings(0)
val subject_id: String = strings(1)
val score: Int = strings(2).toInt
Score(id, subject_id, score)
})
val subjectBS: BufferedSource = Source.fromFile("scala/data/subject.csv")
subjectList = subjectBS.getLines()
.toList
.map((s: String) => {
val strings: Array[String] = s.split(",")
val subject_id: String = strings(0)
val subject_name: String = strings(1)
val subject_score: Int = strings(2).toInt
Subject(subject_id, subject_name, subject_score)
})
subNameMap = subjectList.map((subject: Subject) => (subject.subject_id, subject.subject_name)).toMap
subScoreMap = subjectList.map((subject: Subject) => (subject.subject_id, subject.subject_score)).toMap
}
private def printResultWithId(ids: List[String]): Unit = {
scoreList.filter((s: Score) => ids.contains(s.id))
.map((s: Score) => {
val nameWithClazz: String = stuInfoMap.getOrElse(s.id, "查无此人")
val subjectName: String = subNameMap.getOrElse(s.subject_id, "没有这个科目")
s"${s.id},${nameWithClazz},${subjectName},${s.score}"
}).foreach(println)
}
private def clazzCount(): Unit = {
stuList.groupBy((s: Student) => s.clazz)
.map((kv: (String, List[Student])) => kv._1 + "," + kv._2.size)
.foreach(println)
}
private def studentSumScore(): Unit = {
val studentSumScoreRes: Map[String, Int] = scoreList.groupBy((s: Score) => s.id)
.map((kv: (String, List[Score])) => (kv._1, kv._2.map((s: Score) => s.score).sum))
val stuSumScoreList: List[String] = stuList.map((s: Student) => {
val sumScore: Int = studentSumScoreRes.getOrElse(s.id, 0)
s"${s.id},${s.name},${s.age},$sumScore"
})
stuSumScoreList.foreach(println)
}
private def studentSumScoreTop10(): Unit = {
val ids: List[String] = scoreList.groupBy((s: Score) => s.id)
.map((kv: (String, List[Score])) => (kv._1, kv._2.map((s: Score) => s.score).sum))
.toList
.sortBy((kv: (String, Int)) => -kv._2)
.take(10)
.map((kv: (String, Int)) => kv._1)
printResultWithId(ids)
}
private def sumScoreGAvgScore(): Unit = {
val avgSumScore: Double = (scoreList.map(_.score).sum / stuList.size).toDouble
scoreList.groupBy((s: Score) => s.id)
.map((kv: (String, List[Score])) => (kv._1, kv._2.map((s: Score) => s.score).sum))
.filter((kv: (String, Int)) => kv._2 > avgSumScore)
.map((kv: (String, Int)) => {
val nameWithClazz: String = stuInfoMap.getOrElse(kv._1, "查无此人")
s"${kv._1},$nameWithClazz,${kv._2}"
}).foreach(println)
}
private def subjectPassStudents(): Unit = {
val ids: List[String] = scoreList.filter((s: Score) => s.score >= subScoreMap.getOrElse(s.subject_id, 0) * 0.6)
.groupBy((s: Score) => s.id)
.map((kv: (String, List[Score])) => (kv._1, kv._2.size))
.filter((kv: (String, Int)) => kv._2 == 6)
.keys
.toList
printResultWithId(ids)
}
private def clazzSumScoreTop3(): Unit = {
scoreList.groupBy((s: Score) => s.id)
.map((kv: (String, List[Score])) => (kv._1, kv._2.map((s: Score) => s.score).sum))
.map((kv: (String, Int)) => {
val nameWithClazz: String = stuInfoMap.getOrElse(kv._1, "查无此人")
val strings: Array[String] = nameWithClazz.split(",")
val name: String = strings(0)
val clazz: String = strings(1)
(kv._1, name, clazz, kv._2)
})
.groupBy(_._3)
.flatMap((kv: (String, Iterable[(String, String, String, Int)])) => {
kv._2.toList.sortBy(-_._4).take(3)
}).foreach(println)
}
private def partialBadlyStuTop100(): Unit = {
val ids: List[String] = scoreList.map((s: Score) => {
(s.id, s.subject_id, s.score * 100.toDouble / subScoreMap.getOrElse(s.subject_id, 0))
}).groupBy(_._1)
.map((kv: (String, List[(String, String, Double)])) => {
val id: String = kv._1
val scoreGuiList: List[(String, String, Double)] = kv._2
val stuGeRenAvgScore: Double = scoreGuiList.map(_._3).sum / scoreGuiList.size
val partial: Double = scoreGuiList.map((t: (String, String, Double)) => {
Math.pow(t._3 - stuGeRenAvgScore, 2)
}).sum / scoreGuiList.size
(id, partial)
}).toList
.sortBy(-_._2)
.take(100)
.map(_._1)
printResultWithId(ids)
}
def main(args: Array[String]): Unit = {
loadData()
partialBadlyStuTop100()
}
}