有文件如下:请使用Spark sql完成以下功能:
校区 班级 成才率 出勤率 平均分
上地 1704K 91 99 93
上海 1704G 89 99 94
上地 1601A 79 99 88
上地 1602A 69 98 78
上地 1603A 59 98 68
上地 1604A 89 98 98
上地 1701A 99 99 78
上地 1702A 99 98 88
上海 1703A 95 97 98
上海 1703B 85 97 88
上地 1703C 75 97 78
上海 1703D 96 99 68
上地 1704F 94 99 90
上海 1704E 95 100 92
要求:
(1)读取文件,解析文件(4分)
(2)将以上数据注册成studeng_scores临时表(4分)
(3)打印出综合分数(各项数值之和)排在前5的班级校区和对应的名称(5分)
(4)打印出成才率大于60的班级(5分)
(5)将以上数据按照成材率倒序排序,若成材率相同则出勤率倒序排序输出(5分)
分别计算上地、上海校区成材率的平均值(5分)
import org.apache.spark.rdd.RDD
import org.apache.spark.sql.{DataFrame, SparkSession}
object Test3 {
System.setProperty("hadoop.home.dir","E:/x3/hadoop-2.9.2")
def main(args: Array[String]): Unit = {
val spark: SparkSession = SparkSession.builder().appName("test3").master("local").getOrCreate()
val dataRDD: RDD[String] = spark.sparkContext.textFile("C:\\Users\\s1378\\Desktop\\week3data2/test3.txt")
//除去首行
val linesRDD: RDD[String] = dataRDD.zipWithIndex().filter(line => line._2>=1).map(line => line._1)
val lineRDD: RDD[(String, String, Int, Int, Int)] = linesRDD.map(line => {
val arr: Array[String] = line.split(" ")
(arr(0),arr(1),arr(2).toInt,arr(3).toInt,arr(4).toInt)
})
import spark.implicits._
val dataDF: DataFrame = lineRDD.toDF("schoolName","className","chengcai","chuqin","avgAll")
dataDF.createTempView("student")
//综合分数(各项数值之和)排在前5的班级校区和对应的名称
//spark.sql("select schoolName,className,(chengcai+chuqin+avgAll) sumAll from student order by sumAll desc limit 5").show()
//成才率大于60的班级
//spark.sql("select className from student where chengcai > 60").show()
//按照成材率倒序排序,若成材率相同则出勤率倒序排序输出
//spark.sql("select * from student order by chengcai desc,chuqin desc").show()
//分别计算上地、上海校区成材率的平均值
spark.sql("select schoolName,avg(chengcai) ccavg from student group by schoolName").show()
spark.stop()
}
}