使用Spark SQL分析,找出每种类型的评分最高10部电影,用scala编程语言
时间: 2024-03-24 17:38:59 浏览: 60
基于Spark的电影数据集分析
5星 · 资源好评率100%
好的,根据你的要求,我们可以使用Spark SQL分析数据并找出每种类型的评分最高10部电影。具体的步骤如下:
1. 加载数据:我们可以使用Spark SQL的DataFrame API加载电影和评分数据。电影数据包含电影ID、电影名称和电影类型等信息,评分数据包含用户ID、电影ID和评分值等信息。
2. 数据预处理:我们需要将电影类型列拆分为多个列,并将评分数据按电影ID进行分组以便后续分析。
3. 分析数据:我们可以使用Spark SQL的API进行数据分析,找出每种类型的评分最高10部电影。
下面是Scala代码实现:
```scala
import org.apache.spark.sql.SparkSession
import org.apache.spark.sql.functions._
import org.apache.spark.sql.types._
object TopMoviesByGenre {
def main(args: Array[String]): Unit = {
val spark = SparkSession.builder()
.appName("TopMoviesByGenre")
.master("local[*]")
.getOrCreate()
// 加载数据
val moviesSchema = StructType(Seq(
StructField("movieId", IntegerType, nullable = false),
StructField("title", StringType, nullable = false),
StructField("genres", StringType, nullable = false)
))
val movies = spark.read.format("csv")
.option("header", "true")
.option("delimiter", ",")
.schema(moviesSchema)
.load("movies.csv")
val ratingsSchema = StructType(Seq(
StructField("userId", IntegerType, nullable = false),
StructField("movieId", IntegerType, nullable = false),
StructField("rating", FloatType, nullable = false),
StructField("timestamp", LongType, nullable = false)
))
val ratings = spark.read.format("csv")
.option("header", "true")
.option("delimiter", ",")
.schema(ratingsSchema)
.load("ratings.csv")
// 数据预处理
val genres = udf((s: String) => s.split("\\|"))
val moviesWithGenres = movies.withColumn("genre", explode(genres(col("genres"))))
.select("movieId", "title", "genre")
val movieRatings = ratings.groupBy("movieId").agg(avg("rating").as("avgRating"))
// 分析数据
val topMoviesByGenre = moviesWithGenres.join(movieRatings, Seq("movieId"))
.groupBy("genre")
.agg(max("avgRating").as("maxRating"))
.join(moviesWithGenres.join(movieRatings, Seq("movieId")), Seq("genre", "maxRating"))
.select("genre", "title", "maxRating")
.orderBy("genre", desc("maxRating"))
.limit(10)
// 输出结果
topMoviesByGenre.show()
}
}
```
在以上代码中,我们使用了Spark SQL的DataFrame API加载数据,并使用explode函数将电影类型拆分为多个列,最后使用join和groupBy函数进行数据分析。其中,movies.csv和ratings.csv是电影和评分数据文件,可以根据实际情况进行替换。
最后,我们可以在终端运行上述程序,得到每种类型的评分最高10部电影的结果。
阅读全文