对电影评分数据进行统计分析、使用是sparkSQL中的SQL编程和DSL编程,实现获取电影平均分top10的并要求电影评分次数大于200的
代码如下:
package com.spark.day5
import org.apache.spark.sql.SparkSession
/**
* @author yogurt
* @Date 2022/11/26 - 10:59 - 2022
*
*/
object movicDateAnalysis {
def main(args: Array[String]): Unit = {
// 准备环境
val session = SparkSession.builder().appName("sparkSQL").master("local[*]")
.config("spark.sql.shuffle.partitions", "4")
.getOrCreate()
val context = session.sparkContext
context.setLogLevel("error")
import session.implicits._
// 加载数据
val text = session.read.textFile("data/input/rating_100k.data")
val dataFrame = text.map(m => {
val word = m.split("\t")
(word(1), word(2).toInt)
}).toDF("movieId", "score")
dataFrame.printSchema()
dataFrame.show()
println("------------------使用SQL==>统计评分次数>200的电影平均分Top10--------------------------")
// SQL //需求:统计评分次数>200的电影平均分Top10
// 注册表
dataFrame.createOrReplaceTempView("t_movies")
val sql: String =
"""
|select movieId,avg(score) as avgscore,count(*) as counts
|from t_movies
|group by movieId
|having counts > 200
|order by avgscore desc
|limit 10
|""".stripMargin
session.sql(sql).show()
// DSL
println("------------------使用DSL==>统计评分次数>200的电影平均分Top10--------------------------")
import org.apache.spark.sql.functions._
dataFrame.groupBy("movieId").agg(avg("score") as "avgscore",count("movieId") as "count")
.filter('count > 200).orderBy('avgscore desc).limit(10).show()
}
}