SparkSQL案例--电影数据分析

187 阅读1分钟

对电影评分数据进行统计分析、使用是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()
    
  }
}

图片.png

图片.png