每天天都在努力学习的我们

前言

本篇博客讲解的内容依旧是使用Spark进行相关的数据分析,按理来说数据分析完之后应该搞一搞可视化的,由于目前时间紧张,顾不得学习可视化了,先来看一下此次的内容把。

在Kaggle数据平台下载了数据集albunms.csv,里面包含了的主要字段如下,先来看一下。

使用Spark读取csv

spark读取csv的方式有两种,一种是使用rdd进行读取csv,然后创建RDD对象。另一种是使用spark SQL进行读取,创建DataFrame对象。本篇博客使用Spark SQL进行读取文件,RDD和Data Frame处理数据。

csv文件我们都知道,","分隔符,但是读取csv文件的同时也要注意是否有无表头,表头字段类型。下面来看一下Spark SQL读取csv。

private
val sparkConf: SparkConf = new SparkConf().setMaster("local[*]").setAppName("Spark SQL") private
val sparkContext = new SparkContext(sparkConf)
private val sparkSession: SparkSession =SparkSession.builder().config(sparkConf).getOrCreate() import sparkSession.implicits._ def
Transform_demo()={
//使用sparksession 读取csv文件,此csv文件有表头
val dataFrame = sparkSession.read.format("com.databricks.spark.csv")
//有无表头
.option("header", true)//是否自动推断表头类型.option("inferSchema", false)
//分隔符
.option("delimiter", ",")
//csv文件的地址
.csv("date/albums.csv")
dataFrame
}

统计各类型专辑的数量

思路:

各类型专辑的数量 ==》根据专辑类型(genre)分组,求出专辑类型的总和

使用spark SQL进行处理

def genre_demo() = {//统计各个类型专辑的数量
val unit = Transform_demo()
.select($"genre")
.groupBy($"genre")
.count()
.sort($"count".desc)
.show() }

在Spark SQL中使用group by的时候,提供了group by之后的操作,比如

     max(colNames:String*):获取分组中指定字段或者所有的数字类型字段的最大值,只能作用于数字型字段。

        min(colNames:String*):获取分组字段或者所有的数字类型字段的最小值,只能作用于数字类型的字段。

        mean(colName:String*):获取分组中指定字段或者所有数字类型字段的平均值,只能作用于数据类型的字段

        sum(colNames:String*):获取分组中指定字段或者所有数字类型字段的累加值,只能作用于数字类型的字段

        count():获取分组中的元素个数

根据genre字段分组后,求出专辑类型的个数,对专辑类型的个数进行排序。如果需要导入到文件里面,那么需要.write。

使用Rdd进行处理

     def genre_demo() = {val value = Transform_demo()
.select($"genre")
.rdd.map(v => (v(0), 1)).reduceByKey(_ + _).sortBy(_._2,false)

展示一下上面的流程图把

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

思路:

根据专辑类型分组,分组之后,计算num_of_sales专辑销量总和。

如果是spark SQL的话,流程应该是这样的。

      dataFrame => select => group by => sum()

来看一下代码

def countByNum_sales()={Transform_demo()
.select($"genre",$"num_of_sales")
.withColumn("num_of_sales",col("num_of_sales").cast("Integer"))
.groupBy("genre").sum("num_of_sales")
.orderBy($"sum(num_of_sales)".desc).show() }

如果在group by后面直接sum求和,那么是会报错的,因为在最开始的时候,我们并没有让系统自动推断表头的数据类型,默认为String类型,因此需要先转换为整型,然后对其进行操作。

来看一下RDD的代码

def countByNum_sales()={val value = Transform_demo()
.select($"genre", $"num_of_sales")
.rdd
.map(v => (v(0).toString, v(1).toString.toInt))
.reduceByKey(_ + _) .sortBy(_._2, false)
value }

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

思路:

根据年份分组(year_of_pub),求每年发行的专辑数量和单曲数量。

单曲数量很简单(num_of_tracks)累加,但是专辑数量怎么表示呢?

       注意一下,num_of_tracks字段:每张专辑中的单曲数量,什么意思呢?来看一下这样的表示

        (num_of_tracks,1) =》 (每张专辑的单曲数量,专辑数量)

这个1就代表着专辑的数量。

用RDD来理一下思路,(年份,(每张专辑的单曲数量,1)) ==>经过reduceByKey (年份,(每年发行的单曲数量,每年发行的专辑数量))

def Countbytracks() ={//统计近20年每年发行的专辑数量和单曲数量;//每年发行的单曲数量 num_of_tracks 专辑数量怎么算呢?//num_of_tracks: 每张专辑中单曲数量//(1张专辑,专辑发行的单曲数量)
val array = Transform_demo()
.select($"year_of_pub", $"num_of_tracks")
.rdd
.map(v => (v(0).toString.toInt, (v(1).toString.toInt, 1))).reduceByKey((x, y) => (x._1 + y._1, (x._2 + y._2))).sortByKey()
array }

来看一下流程图

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

思路:

    首先求出来总销售量前五的专辑类型,然后取前五个数量最多的,之后在这个五个数量最多的专辑类型里面计算每年的销量。

首先获取总销售量前五的专辑类型

def get_genre() = {
//先获取总销售量前5的专辑类型
val array = Transform_demo()
.select($"genre", $"num_of_sales")
.withColumn("num_of_sales", col("num_of_sales").cast("Integer"))
.groupBy($"genre").sum("num_of_sales").orderBy($"sum(num_of_sales)".desc)
.rdd
.map(v => v(0).toString)
.take(5)
array }

首先更改字段类型,根据销售类型(genre)分组,找到销量最多的销售类型.经过map转换之后取前五个销售类型。

        获取总销量前5的专辑类型的各年份销量

def per_year_sales()={val genre_list = get_genre()val value = Transform_demo()
.select($"genre", $"year_of_pub", $"num_of_sales").rdd.filter(v => genre_list.contains(v(0)) ).map(v => ((v(0).toString, v(1).toString), v(2).toString.toInt))
.reduceByKey(_ + _)value }

如果单独看上面的代码看不懂,那么来看一下下面的流程图把,一定明明白白。

总结

关于这篇音乐分析项目就到此为止了。

关于对数据的基本处理已经有了些眉目,接下来就是不断的练习练习。

之后还有会其它的项目,我们最终的Boss项目就是离线数仓项目的建设。

     最后,希望我的她可以越来越好,天天开心

基于Spark的音乐专辑数据分析相关推荐

  1. 【计算机大数据毕设之基于spark+hadoop的大数据分析论文写作参考案例】

    [计算机大数据毕设之基于spark+hadoop的大数据分析论文写作参考案例-哔哩哔哩] https://b23.tv/zKOtd3L 目  录 一 引言​1 二 系统分析​2 2.1 必要性和可行性 ...

  2. 基于javaweb的音乐专辑商城系统(java+ssm+jsp+jquery+mysql)

    基于javaweb的音乐专辑商城系统(java+ssm+jsp+jquery+mysql) 运行环境 Java≥8.MySQL≥5.7.Tomcat≥8 开发工具 eclipse/idea/myecl ...

  3. 基于Spark技术的银行客户数据分析

    基于Spark技术的银行客户数据分析 1. 实验室名称: 2. 实验项目名称: 一.业务场景 二.数据集说明 三.操作步骤 阶段一.启动HDFS.Spark集群服务和zeppelin服务器 阶段二.准 ...

  4. 基于Spark GraphX 的图形数据分析

    文章目录 为什么需要图计算 一.图(Graph)的基本概念 二.Spark GraphX 简介 三.GraphX API 1.属性图应用示例-1 2.属性图应用示例-2 3.查看图信息 4.图的算子 ...

  5. 基于Spark GraphX的图形数据分析

    目录 1.为什么需要图计算 2.图的概念 2.1 图的基本概念及应用场景 2.2 图的术语 2.2.1 顶点(Vertex)和边(Edge) 2.2.2 有向图和无向图 2.2.3 有环图和无环图 2 ...

  6. Spark大数据分析与实战:基于Spark MLlib 实现音乐推荐

    Spark大数据分析与实战:基于Spark MLlib 实现音乐推荐 基于Spark MLlib 实现音乐推荐 一.实验背景: 熟悉 Audioscrobbler 数据集 基于该数据集选择合适的 ML ...

  7. 【毕业设计_课程设计】基于Spark网易云音乐数据分析

    文章目录 0 项目说明 1 系统模块 2 分析内容 3 界面展示 4 项目工程 0 项目说明 基于Spark网易云音乐数据分析 提示:适合用于课程设计或毕业设计,工作量达标,源码开放 1 系统模块 包 ...

  8. spark数据挖掘 - 基于 Audioscrobbler 数据集音乐推荐实战

    基于 Audioscrobbler 数据集音乐推荐实战 1. 数据集 这个例子将使用 Audioscrobbler 公开的数据集.Audioscrobbler是http://www.last.fm/z ...

  9. 基于Hadoop和Spark体系的大数据分析平台构建

    谢谢分享! 转载:http://www.sohu.com/a/249271561_481409 随着大数据.人工智能等技术的快速发展,企业对大数据平台的需求越来越强烈,通过大数据分析技术为企业提供经营 ...

最新文章

  1. linux sed给空文件首行插入_Linux系统中sed命令在文件某行前后添加内容的用法
  2. ASP.NET MVC 5 - 验证编辑方法(Edit method)和编辑视图(Edit view)
  3. Isometric Game 及译法漫谈
  4. 洛谷P4216 [SCOI2015]情报传递(树剖+主席树)
  5. arcgis server for flex中文乱码问题(转)
  6. 东莞新能源——业务流程管理实践
  7. 【机器学习PAI实践五】机器学习眼中的《人民的名义》
  8. jdbcTemplate数据库连接的使用
  9. 【火爆全网,好评如潮】DS100手持示波器现货发售拉,附原子哥发布会详细讲解视频以及宣传视频...
  10. 记一次小程序富文本的小小优化
  11. 电缆的验证、鉴定和认证应该选择什么测试工具
  12. Microsoft将在UWP上支持React Native,同时为VS Code添加工具软件
  13. quartz java 线程 不释放_java Quartz 内存泄漏
  14. LUOGU P4016 负载平衡问题
  15. jdbc mysql分页_JDBC【数据库连接池、DbUtils框架、分页】
  16. 国资委发文!10本书讲透数字化时代新机遇
  17. .sql文件_自己动手写SQL查询引擎
  18. MySql数据类型分析(银行家舍入法) Part3
  19. 备考OCJP认证知识点总结(一)
  20. 台服DNF修改Script.pvf文件修改黑钻抽奖机的道具爆率,图文详解

热门文章

  1. 计算器ajax实现代码,jQuery实现简单的计算器特效代码
  2. 128*64点阵图形液晶显示屏程序设计教程
  3. Xposed框架的简单使用
  4. JMeter 最大并发数
  5. 阿里云轻量级服务器安装docker
  6. vue3.x 快速原型开发
  7. 百度Java架构师谈Java面向对象
  8. C语言编程题-大总结(个人专升本艾宾浩斯复习笔记)
  9. 为什么找到的基址,是进程名+16进制的数
  10. 数据库游标以及在java中的应用