当前位置: 首页 > news >正文

Apache Spark 练习六:使用Spark分析音乐专辑数据

一、源数据

本章所分析的数据来自于Kaggle公开的、人工合成的音乐专辑发行数据(https://www.kaggle.com/datasets/revilrosa/music-label-dataset)。以下,我们只针对albums.csv文件进行分析。该数据具体包括以下字段:

  • id: the album identifier;
  • artist_id: the artist identifier;
  • album_title: the title of the album;
  • genre: the genre of the album. An artist can release albums of different genres;
  • year_of_pub: the year the album was published;
  • num_of_tracks: how many tracks there are in the album (a small number can mean longer tracks);
  • num_of_sales: how many sales the album has made in the first month after the release;
  • rolling_stone_critic: how magazine Rolling Stone has rated the album;
  • mtv_critic: how MTV has rated the album;
  • music_maniac_critic: how review site Music Maniac has rated the album.

二、练习题

0. 数据预处理

以下,我们将csv文件从HDFS中读取进来,并转换为Spark DataFrame格式。

val spark = SparkSession
  .builder()
  .appName("Albums")
  .getOrCreate()
import spark.implicits._

val df = spark.read
  .option("header", "true")
  .option("inferSchema", "true")
  .csv("hdfs:///SparkLearning/albums.csv")

1. 统计各类型专辑的数量

val res = df
  .select($"genre")
  .groupBy($"genre")
  .count()
  .orderBy($"count".desc)

2. 统计各类型专辑的销量总数

val res = df
  .select($"genre", $"num_of_sales")
  .groupBy($"genre")
  .sum("num_of_sales")
  .withColumnRenamed("sum(num_of_sales)", "total_sales")
  .orderBy($"total_sales".desc)

3. 统计近20年每年发行的专辑数量和单曲数量

val res = df
  .select("year_of_pub", "num_of_tracks")
  .filter($"year_of_pub" >= 2000)
  .groupBy($"year_of_pub")
  .agg("num_of_tracks" -> "count", "num_of_tracks" -> "sum")
  .withColumnRenamed("count(num_of_tracks)", "total_albums")
  .withColumnRenamed("sum(num_of_tracks)", "total_tracks")
  .orderBy("year_of_pub")

4. 分析总销量前五的专辑类型的各年份销量

val res = df
  .select($"genre", $"num_of_sales")
  .groupBy("genre")
  .sum("num_of_sales")
  .withColumnRenamed("sum(num_of_sales)", "total_sales")
  .orderBy($"total_sales".desc)
  .limit(5)
  .alias("t1")
  .join(
    df.select($"genre", $"num_of_sales", $"year_of_pub").alias("t2"),
    $"t1.genre" === $"t2.genre"
  )
  .groupBy("t2.genre", "t2.year_of_pub")
  .sum("t2.num_of_sales")
  .orderBy($"genre", $"year_of_pub")

5. 分析总销量前五的专辑类型,在不同评分体系中的平均评分

val res = df
  .select($"genre", $"num_of_sales")
  .groupBy("genre")
  .sum("num_of_sales")
  .withColumnRenamed("sum(num_of_sales)", "total_sales")
  .orderBy($"total_sales".desc)
  .limit(5)
  .alias("t1")
  .join(
    df.select(
      $"genre",
      $"rolling_stone_critic",
      $"mtv_critic",
      $"music_maniac_critic"
    ).alias("t2"),
    $"t1.genre" === $"t2.genre"
  )
  .groupBy("t2.genre")
  .agg(
    "rolling_stone_critic" -> "avg",
    "mtv_critic" -> "avg",
    "music_maniac_critic" -> "avg"
  )
  .orderBy($"genre")

相关文章:

  • 做阿里巴巴网站多少钱/东莞seo外包平台
  • 网站建设要注意那些问题/长春网站优化团队
  • 建立网站可以赚钱吗?/关键词优化的建议
  • 商丘集团网站建设/网站维护需要多长时间
  • 公司建设网站需求/重庆网站seo费用
  • 微信第三方做网站需要费用吗/南宁网络推广平台
  • 【DETR目标检测】关键词:Decoder。Encoder。query向量。注意力机制。
  • Hook原理
  • Python定时任务工具--APScheduler
  • 天天写业务代码,如何成为技术大牛?
  • 【SpringBoot+Redis】实现多端登录+token自动续期和定期刷新+自定义注解和拦截器实现鉴权(角色和权限校验)
  • 嵌入式分享合集125
  • 第4、5、6 章
  • VUE—跳转传参
  • 深度解读|NebulaGraph x 阿里云计算巢,云上构建超大规模图数据库
  • 计算机网络—Nginx概述
  • 【学习笔记】JDK源码学习之HashTable(附带面试题)
  • 前端基础(十六)_BFC、box-shadow(盒子阴影)、text-shadow(文字阴影)