packagenet.cb.sqlimportorg.apache.spark.sql.{Dataset,SparkSession}/**
* 功能:利用Spark SQL计算平均分
* 作者:cb
* 日期:2022年06月17日
*/
object CalculateAverageBySQL{
def main(args:Array[String]):Unit={// 创建或得到Spark会话对象
val spark =SparkSession.builder().appName("CalculateAverageBySQL").master("local[*]").getOrCreate()// 读取HDFS上“/score”目录里的成绩文件
val lines:Dataset[String]= spark.read.textFile("hdfs://master:9000/score")// 导入隐式转换importspark.implicits._
// 创建成绩数据集
val gradeDS:Dataset[Grade]= lines.map(
line =>{
val fields = line.split(" ")
val id =fields(0).toInt
val name =fields(1)
val score =fields(2).toInt
Grade(id, name, score)})// 将数据集转换成数据帧
val df = gradeDS.toDF();// 基于数据帧创建临时表
df.createOrReplaceTempView("t_grade")// 查询临时表,计算平均分
val avg = spark.sql("""
|select first(id) as id, name, cast(avg(score) as decimal(5, 2)) as average
| from t_grade
| group by name
| order by id
|""".stripMargin
)// 按照指定格式输出平均成绩println()
avg.collect.foreach(row =>println(row(0)+" "+row(1)+" "+ row (2)))// 关闭Spark会话
spark.close()}// 定义成绩样例类caseclassGrade(id:Int, name:String, score:Int)}