基于Spark的音乐专辑数据分析(scala)

本博客介绍了一种使用Spark和Scala进行音乐专辑数据集分析的方法,包括统计各类型专辑数量、销量,以及近20年专辑和单曲变化趋势。通过可视化技术展示了分析结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

本项目所使用的数据及其编写的代码,可戳 https://download.csdn.net/download/atuo200/12716083下载。本项目采用scala编写数据分析代码,若采用python编写数据分析代码,可参考 基于Spark的音乐专辑数据分析展示

数据来源

数据集albums.csv,包含了10万条音乐专辑的数据。主要字段说明如下:

  1. album_title:音乐专辑名称
  2. genre:专辑类型
  3. year_of_pub: 专辑发行年份
  4. num_of_tracks: 每张专辑中单曲数量
  5. num_of_sales:专辑销量
  6. rolling_stone_critic:滚石网站的评分
  7. mtv_critic:全球最大音乐电视网MTV的评分
  8. music_maniac_critic:音乐达人的评分
数据分析

下面对音乐专辑数据集albums.csv进行了一系列的分析,包括:

  1. 统计各类型专辑的数量;
  2. 统计各类型专辑的销量总数;
  3. 统计近20年每年发行的专辑数量和单曲数量;
  4. 统计总销量前五的专辑类型的各年份销量;

编写scala代码

mkdir musicCount
cd musicCount
mkdir -p src/main/scala
src/main/scala
vi musicCount.scala
import org.apache.spark.sql.SparkSession
import org.apache.spark.SparkContext
import java.io._

object App {
   
   
  def main(args:Array[String]){
   
   
    val conf = new SparkConf().setAppName("genreSales")
    val sc = new SparkContext(conf)
    val spark=SparkSession.builder().getOrCreate()
      //加载数据文件时这里采用本地文件系统,要确保各个spark节点相同路径下都有albums.csv;并也可采用hdfs文件系统,把albums.csv上传到hdfs中
    val df = spark.read.format("com.databricks.spark.csv").option("header", "true").option("inferSchema", "false").option("delimiter",",").load("file:///usr/local/spark/data/mllib/albums.csv")
    import spark.implicits._

    val genre_count = df.groupBy("genre").count()
    val genre_array = genre_count.filter(genre_count("count") > 2000)
    val result1 = genre_array.toJSON.collectAsList.toString
    val writer1 = new PrintWriter(new File("/usr/local/spark/data/music_diy/result1.json" ))
    writer1.write(result1)
    writer1.close()

    val genre_sales = df.select(df("genre"), df("num_of_sales")).rdd.map(v => (v(0).toString, v(1).toString.toInt)).reduceByKey(_+_).collect()
    val result2 = sc.parallelize(genre_sales).toDF().toJSON.collectAsList.toString
    val writer2 = new PrintWriter(new File("/usr/local/spark/data/music_diy/result2.json" ))
    writer2.write(result2)
    writer2.close()

    val tracksAndSales = df.select(df("year_of_pub"), df("num_of_tracks")).rdd.map(v => (v(0).toString.toInt, List(v(1).toString.toInt,1))).reduceByKey((x,y) => List(x(0) + y(0), x(1) + y(1))).sortByKey().collect()
    val result3 = sc.parallelize(tracksAndSales).toDF().toJSON.collectAsList.toString
    val writer3 = new PrintWriter(new File("/usr/local/spark/data/music_diy/result3.json" ))
    writer3.write(result3)
    writer3.close()


    val tmp = df.groupBy("genre").count()
    val genre_list = tmp.orderBy(tmp("count").desc).rdd.map(v=>v(0).toString).take(5)
    val genreYearHotArray = df.select(df("genre"), df("year_of_pub"), df("num_of_sales")).rdd.filter(v => genre_list.contains(v(0))).map(v => ((v(0).toString, v(1).toString.toInt), v(2).toString.toInt)).reduceByKey(_+_).collect()
    val result4 = sc.parallelize(genreYearHotArray).toDF().toJSON.collectAsList.toString
    val writer4 = new PrintWriter(new File("/usr/local/spark/data/music_diy/result4.json" ))
    writer4.write(result4)
    writer4.close()
    spark.close()
  }
  }

编写sbt打包文件

name := "peopleage project"
version := "1.0"
scalaVersion := "2.11.12"
libraryDependencies += "org.apache.spark" %% "spark-core" % "2.4.5"
libraryDependencies += "org.apache.spark" % "spark-sql_2.11"
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值