图解大数据 | 综合案例-使用Spark分析挖掘音乐专辑数据

基于Spark的音乐专辑数据分析(scala) 前言 本项目所使用的数据及其编写的代码,可戳 https://download.youkuaiyun.com/download/atuo200/12716083下载。本项目采用scala编写数据分析代码,若采用python编写数据分析代码,可参考 基于Spark的音乐专辑数据分析展示。 数据来源 数据集albums.csv,包含了10万条音乐专辑的数据。主要字段说明如下: album_title:音乐专辑名称 genre:专辑类型 year_of_pub: 专辑发行年份 num_of_tracks: 每张专辑中单曲数 阅读详情

作者:韩信子@ShowMeAI
教程地址:http://www.showmeai.tech/tutorials/84
本文地址:http://www.showmeai.tech/article-detail/178
声明:版权所有,转载请联系平台与作者并注明出处

收藏ShowMeAI查看更多精彩内容


引言

文娱影音是目前大数据与AI应用最广泛的场景之一,本案例以音乐专辑发行数据为背景,讲解使用pyspark对HDFS存储的数据进行处理数据分析的过程,并且对分析结果做了可视化呈现。

1.实验环境

  • (1)Linux: Ubuntu 16.04
  • (2)Python: 3.8
  • (3)Hadoop:3.1.3
  • (4)Spark: 2.4.0
  • (5)Web框架:flask 1.0.3
  • (6)可视化工具:Echarts
  • (7)开发工具:Visual Studio Code

为了支持Python可视化分析,大家可以运行如下命令安装Flask组件:

sudo apt-get install python3-pip
pip3 install flask

2.实验数据集

1)数据集说明

数据集和源代码下载
链接:https://pan.baidu.com/s/1C0VI6w679izw1RENyGDXsw
提取码:show

本案例的数据集来自于Kaggle平台,数据名称albums.csv,包含了10万条音乐专辑的数据(大家可以通过上述百度网盘地址下载)。主要字段说明如下:

  • album_title:音乐专辑名称
  • genre:专辑类型
  • year_of_pub: 专辑发行年份
  • num_of_tracks: 每张专辑中单曲数量
  • num_of_sales:专辑销量
  • rolling_stone_critic:滚石网站的评分
  • mtv_critic:全球最大音乐电视网MTV的评分
  • music_maniac_critic:音乐达人的评分

2)上传数据至HDFS

(1)启动Hadoop中的HDFS组件,在命令行运行下面命令:

/usr/local/hadoop/sbin/start-dfs.sh

(2)在hadoop上登录用户创建目录,在命令行运行下面命令:

hdfs dfs -mkdir -p /user/hadoop

(3)把本地文件系统中的数据集albums.csv上传到分布式文件系统HDFS中:

hdfs dfs -put albums.csv

3.pyspark数据分析

1)建立工程文件

(1)创建文件夹code
(2)在code下创建project.py文件
(3)在code下创建static文件夹,存放静态文件
(4)在code/static文件夹下面创建data目录,存放分析生成的json数据

2)进行数据分析

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

(1)统计各类型专辑的数量
(2)统计各类型专辑的销量总数
(3)统计近20年每年发行的专辑数量和单曲数量
(4)分析总销量前五的专辑类型的各年份销量
(5)分析总销量前五的专辑类型,在不同评分体系中的平均评分

3)代码实现

project.py代码如下:

from pyspark import SparkContext
from pyspark.sql import SparkSession
import json

#统计各类型专辑的数量(只显示总数量大于2000的十种专辑类型)
def genre(sc, spark, df):
    #按照genre字段统计每个类型的专辑总数,过滤出其中数量大于2000的记录
    #并取出10种类型用于显示
    j = df.groupBy('genre').count().filter('count > 2000').take(10)
    #把list数据转换成json字符串,并写入到static/data目录下的json文件中
    f = open('static/data/genre.json', 'w')
    f.write(json.dumps(j))
    f.close()

#统计各个类型专辑的销量总数
def genreSales(sc, spark, df):
    j = df.select('genre', 'num_of_sales').rdd\
        .map(lambda v: (v.genre, int(v.num_of_sales)))\
            .reduceByKey(lambda x, y: x + y).collect()
    f = open('static/data/genre-sales.json', 'w')
    f.write(json.dumps(j))
    f.close()

#统计每年发行的专辑数量和单曲数量
def yearTracksAndSales(sc, spark, df):
    #把相同年份的专辑数和单曲数量相加,并按照年份排序
    result = df.select('year_of_pub', 'num_of_tracks').rdd\
        .map(lambda v: (int(v.year_of_pub), [int(v.num_of_tracks), 1]))\
            .reduceByKey(lambda x, y: [x[0] + y[0], x[1] + y[1]])\
                .sortByKey()\
                .collect()

    #为了方便可视化实现,将列表中的每一个字段分别存储
    ans = {}
    ans['years'] = list(map(lambda v: v[0], result))
    ans['tracks'] = list(map(lambda v: v[1][0], result))
    ans['albums'] = list(map(lambda v: v[1][1], result))
    f = open('static/data/year-tracks-and-sales.json', 'w')
    f.write(json.dumps(ans))
    f.close()

#取出总销量排名前五的专辑类型
def GenreList(sc, spark, df):
    genre_list = df.groupBy('genre').count()\
        .orderBy('count',ascending = False).rdd.map(lambda v: v.genre).take(5)
    return genre_list


#分析总销量前五的类型的专辑各年份销量
def GenreYearSales(sc, spark, df, genre_list):
    #过滤出类型为总销量前五的专辑,将相同类型、相同年份的专辑的销量相加,并进行排序。
    result = df.select('genre', 'year_of_pub', 'num_of_sales').rdd\
        .filter(lambda v: v.genre in genre_list)\
            .map(lambda v: ((v.genre, int(v.year_of_pub)), int(v.num_of_sales)))\
                .reduceByKey(lambda x, y: x + y)\
                    .sortByKey().collect()

    #为了方便可视化数据提取,将数据存储为适配可视化的格式
    result = list(map(lambda v: [v[0][0], v[0][1], v[1]], result))
    ans = {}
    for genre in genre_list:
        ans[genre] = list(filter(lambda v: v[0] == genre, result))
    f = open('static/data/genre-year-sales.json', 'w')
    f.write(json.dumps(ans))
    f.close()

#总销量前五的专辑类型,在不同评分体系中的平均评分
def GenreCritic(sc, spark, df, genre_list):
    #过滤出类型为总销量前五的专辑,将同样类型的专辑的滚石评分、mtv评分,音乐达人评分分别取平均
    result = df.select('genre', 'rolling_stone_critic', 'mtv_critic', 'music_maniac_critic').rdd\
        .filter(lambda v: v.genre in genre_list)\
        .map(lambda v: (v.genre, (float(v.rolling_stone_critic), float(v.mtv_critic), float(v.music_maniac_critic), 1)))\
        .reduceByKey(lambda x, y : (x[0] + y[0], x[1] + y[1], x[2] + y[2], x[3] + y[3]))\
        .map(lambda v: (v[0], v[1][0]/v[1][3], v[1][1]/v[1][3], v[1][2]/v[1][3])).collect()

    f = open('static/data/genre-critic.json', 'w')
    f.write(json.dumps(result))
    f.close()


#代码入口

if __name__ == "__main__":
    sc = SparkContext( 'local', 'test')
    sc.setLogLevel("WARN")
    spark = SparkSession.builder.getOrCreate()
    file = "albums.csv"
    df = spark.read.csv(file, header=True)  #dataframe

    genre_list = GenreList(sc, spark, df)

    genre(sc, spark, df)
    genreSales(sc, spark, df)
    yearTracksAndSales(sc, spark, df)
    GenreYearSales(sc, spark, df, genre_list)
    GenreCritic(sc, spark, df, genre_list)

4)代码运行

(1)在Ubuntu终端窗口中,用 hadoop 用户登录,在命令行运行 su hadoop,并输入用户密码。
(2)进入代码所在目录。
(3)为了能够读取HDFS中的 albums.csv 文件,在命令行运行:

/usr/local/hadoop/sbin/start-dfs.sh

(4)在命令行运行:

spark-submit project.py

4.可视化实现

本案例的可视化基于Echarts实现,实现的可视化页面部署在基于flask框架的web服务器上。

1)相关代码结构

(1)在code目录下新建 VisualizationFlask.py 文件,存放 Flask 应用。
(2)在code目录下新建一个名为 templates 的文件夹,存放 html文件。
(3)在 code/static 目录下新建一个名为 js 的文件夹,存放 js 文件。

2)建立Flask应用

在SparkFlask.py文件中复制以下代码:

from flask import render_template
from flask import Flask
# from livereload import Server

app = Flask(__name__)

@app.route('/')
def index():
    #使用 render_template() 方法来渲染模板
    return render_template('index.html')

@app.route('/<filename>')
def req_file(filename):
    return render_template(filename)

if __name__ == '__main__':   
    app.DEBUG=True#代码调试立即生效
    app.jinja_env.auto_reload = True#模板调试立即生效
app.run()#用 run() 函数来让应用运行在本地服务器上

3)下载js文件

(1)在网站上下载jQuery(https://cdn.bootcss.com/jquery/3.4.1/jquery.min.js),将其另存为 jquery.min.js 文件,保存在 code/static/js 目录下。
(2)在官网下载界面下载Echarts(https://echarts.apache.org/zh/download.html),将其另存 echarts-gl.min.js 文件,保存在 code/static/js 目录下。

4)Echarts可视化

(1)在code/templates目录下新建index.html文件。复制以下代码:

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Music</title>
</head>

<body>
    <h2>音乐专辑分析</h2>
    <ul style="line-height: 2em">
        <li><a href="genre.html">各类型专辑的数量统计图</a></li>
        <li><a href="genre-sales.html">各类型专辑的销量统计图</a></li>
        <li><a href="year-tracks-and-sales.html">近20年每年发行的专辑数量和单曲数量统计图</a></li>
        <li><a href="genre-year-sales.html">总销量前五的专辑类型的各年份销量分析图</a></li>
        <li><a href="genre-critic.html">总销量前五的专辑类型的评分分析图</a></li>
    </ul>
</body>
</html>

index.html为主页面,显示每一个统计分析图所在页面的链接。点击任意一个链接,即可跳转到相应页面。

(2)在code/templates目录下新建genre.html文件。复制以下代码:

<!DOCTYPE html>
<html>

<head>
    <meta charset="utf-8">
    <title>ECharts</title>
    <!-- 引入 echarts.js -->
    <script src="static/js/echarts-gl.min.js"></script>
    <script src="static/js/jquery.min.js"></script>
</head>

<body>
    <!-- 为ECharts准备一个具备大小(宽高)的Dom -->
    <a href="/">Return</a>
    <br>
    <br>
    <div id="genre" style="width: 480px;height:500px;"></div>
    <script type="text/javascript">
        $.getJSON("static/data/genre.json", d => {
            _data = d.map(v => ({
                name: v[0],
                value: v[1]
            }))
            // 基于准备好的dom,初始化echarts实例
            var myChart = echarts.init(document.getElementById('genre'), 'light');

            // 指定图表的配置项和数据
            option = {
                title: {
                    text: '各类型专辑的数量统计图',
                    subtext: '从图中可以看出Indie类型的专辑数量最多。',
                    // x: 'center'
                    x: 'left'
                },
                tooltip: {
                    trigger: 'item',
                    formatter: "{a} <br/>{b} : {c} ({d}%)"
                },
                legend: {
                    x: 'center',
                    y: 'bottom',
                    data: d.map(v => v[0])
                },
                toolbox: {
                    show: true,
                    feature: {
                        mark: { show: true },
                        dataView: { show: true, readOnly: false },
                        magicType: {
                            show: true,
                            type: ['pie', 'funnel']
                        },
                        restore: { show: true },
                        saveAsImage: { show: true }
                    }
                },
                calculable: true,
                series: [
                    {
                        name: '半径模式',
                        type: 'pie',
                        radius: [30, 180],
                        center: ['50%', '50%'],
                        roseType: 'radius',
                        label: {
                            normal: {
                                show: false
                            },
                            emphasis: {
                                show: true
                            }
                        },
                        lableLine: {
                            normal: {
                                show: false
                            },
                            emphasis: {
                                show: true
                            }
                        },
                        data: _data
                    }
                ]
            };

            // 使用刚指定的配置项和数据显示图表。
            myChart.setOption(option);
        })
    </script>
</body>
</html>

这个通过读取 code/static/data/genre.json 中的数据,画出玫瑰图,显示各类型专辑的数量。

(3)在code/templates目录下新建genre-sales.html文件。复制以下代码:

<!DOCTYPE html>
<html>

<head>
    <meta charset="utf-8">
    <title>ECharts</title>
    <!-- 引入 echarts.js -->
    <script src="static/js/echarts-gl.min.js"></script>
    <script src="static/js/jquery.min.js"></script>
</head>

<body>
    <a href="/">Return</a>
    <br>
    <br>
    <!-- 为ECharts准备一个具备大小(宽高)的Dom -->
    <div id="genre-sales" style="width: 1000px;height:550px;"></div>
    <script type="text/javascript">
        $.getJSON("static/data/genre-sales.json", d => {
            console.log(d);

            // 基于准备好的dom,初始化echarts实例
            var myChart = echarts.init(document.getElementById('genre-sales'), 'light');

            var dataAxis = d.map(v => v[0]);
            var data = d.map(v => parseInt(v[1])/1e6);

            option = {
                title: {
                    text: '各类型专辑的销量统计图',
                    subtext: '该图统计了各个类型专辑的销量和,从图中可以看出 Indie 类型的专辑销量最高,将近 47 亿。Pop 类型的专辑销量排在第二,约为39亿。',
                    x: 'center',
                    // bottom: 10
                    padding: [0, 0, 15, 0]
                },
                color: ['#3398DB'],
                tooltip: {
                    trigger: 'axis',
                    axisPointer: {            // 坐标轴指示器,坐标轴触发有效
                        type: 'shadow'        // 默认为直线,可选为:'line' | 'shadow'
                    }
                },
                grid: {
                    left: '3%',
                    right: '4%',
                    bottom: '3%',
                    containLabel: true
                },
                xAxis: [
                    {
                        type: 'category',
                        data: dataAxis,
                        axisTick: {
                            show: true,
                            alignWithLabel: true,
                            interval: 0
                        },
                        axisLabel: {
                            interval: 0,
                            rotate: 45,
                        }
                    }
                ],
                yAxis: [
                    {
                        type: 'value',
                        name: '# Million Albums',
                        nameLocation: 'middle',
                        nameGap: 50 
                    }
                ],
                series: [
                    {
                        name: '直接访问',
                        type: 'bar',
                        barWidth: '60%',
                        data: data
                    }
                ]
            };

            // 使用刚指定的配置项和数据显示图表。
            myChart.setOption(option);

        })
    </script>
</body>
</html>

这个通过读取 code/static/data/genre-sales.json 中的数据,画出柱状图,显示各类型专辑的销量总数。

(4)在code/templates目录下新建year-tracks-and-sales.html文件。复制以下代码:

<!DOCTYPE html>
<html>

<head>
    <meta charset="utf-8">
    <title>ECharts</title>
    <!-- 引入 echarts.js -->
    <script src="static/js/echarts-gl.min.js"></script>
    <script src="static/js/jquery.min.js"></script>
</head>

<body>
    <a href="/">Return</a>
    <br>
    <br>
    <!-- 为ECharts准备一个具备大小(宽高)的Dom -->
    <div id="canvas" style="width: 1000px;height:550px;"></div>
    <script type="text/javascript">
        $.getJSON("static/data/year-tracks-and-sales.json", d => {
            console.log(d)
            // 基于准备好的dom,初始化echarts实例
            var myChart = echarts.init(document.getElementById('canvas'), 'light');

            var colors = ['#5793f3', '#d14a61', '#675bba'];

            option = {
                title: {
                    text: '近20年的专辑数量和单曲数量的变化趋势',
                    padding: [1, 0, 0, 15]
                    // subtext: '该图显示了从2000年到2019年发行的专辑数量和单曲数量的变化趋势,从图中可以看出,专辑数量变化很小,基本稳定在5000左右;单曲数量有轻微的波动,大概为专辑数量的10倍。'
                },
                tooltip: {
                    trigger: 'axis'
                },
                legend: {
                    data: ['单曲数量', '专辑数量'],
                    padding: [2, 0, 0, 0]
                },
                toolbox: {
                    show: true,
                    feature: {
                        dataZoom: {
                            yAxisIndex: 'none'
                        },
                        dataView: { readOnly: false },
                        magicType: { type: ['line', 'bar'] },
                        restore: {},
                        saveAsImage: {}
                    }
                },
                xAxis: {
                    type: 'category',
                    boundaryGap: false,
                    data: d['years'],
                    boundaryGap: ['20%', '20%']
                },
                yAxis: {
                    type: 'value',
                    // type: 'log',
                    axisLabel: {
                        formatter: '{value}'
                    }       
                },
                series: [
                    {
                        name: '单曲数量',
                        type: 'bar',
                        data: d['tracks'],
                        barWidth: 15,
                    },
                    {
                        name: '专辑数量',
                        type: 'bar',
                        data: d['albums'],
                        barGap:  '-100%',
                        barWidth: 15,
                    }
                ]
            };

            // 使用刚指定的配置项和数据显示图表。
            myChart.setOption(option);

        })
    </script>
</body>
</html>

这个通过读取 code/static/data/ year-tracks-and-sales.json 中的数据,画出柱状图,显示近20年每年发行的专辑数量和单曲数量。

(5)在code/templates目录下新建genre-year-sales.html文件。复制以下代码:

<!DOCTYPE html>
<html>

<head>
    <meta charset="utf-8">
    <title>ECharts</title>
    <!-- 引入 echarts.js -->
    <script src="static/js/echarts-gl.min.js"></script>
    <script src="static/js/jquery.min.js"></script>
</head>

<body>
    <a href="/">Return</a>
    <br>
    <br>
    <!-- 为ECharts准备一个具备大小(宽高)的Dom -->
    <div id="genre-year-sales" style="width: 1000px;height:550px;"></div>
    <script type="text/javascript">
        $.getJSON("static/data/genre-year-sales.json", d => {
            console.log(d);

            // 基于准备好的dom,初始化echarts实例
            var myChart = echarts.init(document.getElementById('genre-year-sales'), 'light');
            option = {
                legend: {},
                tooltip: {
                    trigger: 'axis',
                    showContent: false
                },
                dataset: {
                    source: [
                        ['year', ...d['Indie'].map(v => `${v[1]}`)],
                        ...['Indie', 'Pop', 'Rap', 'Latino', 'Pop-Rock'].map(v => [v, ...d[v].map(v1 => v1[2])])
                    ]
                },
                xAxis: { type: 'category' },
                yAxis: { gridIndex: 0 },
                grid: { top: '55%' },
                series: [
                    { type: 'line', smooth: true, seriesLayoutBy: 'row' },
                    { type: 'line', smooth: true, seriesLayoutBy: 'row' },
                    { type: 'line', smooth: true, seriesLayoutBy: 'row' },
                    { type: 'line', smooth: true, seriesLayoutBy: 'row' },
                    { type: 'line', smooth: true, seriesLayoutBy: 'row' },
                    {
                        type: 'pie',
                        id: 'pie',
                        radius: '30%',
                        center: ['50%', '25%'],
                        label: {
                            formatter: '{b}: {@2000} ({d}%)' //b是数据名,d是百分比
                        },
                        encode: {
                            itemName: 'year',
                            value: '2000',
                            tooltip: '2000'
                        }
                    }

                ]
            };

            myChart.on('updateAxisPointer', function (event) {
                var xAxisInfo = event.axesInfo[0];
                if (xAxisInfo) {
                    var dimension = xAxisInfo.value + 1;
                    myChart.setOption({
                        series: {
                            id: 'pie',
                            label: {
                                formatter: '{b}: {@[' + dimension + ']} ({d}%)'
                            },
                            encode: {
                                value: dimension,
                                tooltip: dimension
                            }
                        }
                    });
                }
            });

            // 使用刚指定的配置项和数据显示图表。
            myChart.setOption(option);

        })
    </script>
</body>
</html>

这个通过读取 code/static/data/ genre-year-sales.json 中的数据,画出扇形图和折线图,分别显示不同年份各类型专辑的销量占总销量的比例,和总销量前五的专辑类型的各年份销量变化。

(6)在code/templates目录下新建genre-critic.html文件。复制以下代码:

<!DOCTYPE html>
<html>

<head>
    <meta charset="utf-8">
    <title>ECharts</title>
    <!-- 引入 echarts.js -->
    <script src="static/js/echarts-gl.min.js"></script>
    <script src="static/js/jquery.min.js"></script>
</head>

<body>
    <a href="/">Return</a>
    <br>
    <br>
    <!-- 为ECharts准备一个具备大小(宽高)的Dom -->
    <div id="genre-critic" style="width: 1000px;height:550px;"></div>
    <script type="text/javascript">
        $.getJSON("static/data/genre-critic.json", d => {
            console.log(d);

            // 基于准备好的dom,初始化echarts实例
            var myChart = echarts.init(document.getElementById('genre-critic'), 'light');
            option = {
                legend: {},
                tooltip: {},
                dataset: {
                    source: [
                        ['genre', ...d.map(v => v[0])],
                        ['rolling_stone_critic', ...d.map(v => v[1])],
                        ['mtv_critic', ...d.map(v => v[2])],
                        ['music_maniac_critic', ...d.map(v => v[3])]
                    ]
                },
                xAxis: [
                    { type: 'category', gridIndex: 0 },
                    { type: 'category', gridIndex: 1 }
                ],
                yAxis: [
                    { gridIndex: 0 , min: 2.7},
                    { gridIndex: 1 , min: 2.7}
                ],
                grid: [
                    { bottom: '55%' },
                    { top: '55%' }
                ],
                series: [
                    // These series are in the first grid.
                    { type: 'bar', seriesLayoutBy: 'row' , barWidth: 30},
                    { type: 'bar', seriesLayoutBy: 'row' , barWidth: 30},
                    { type: 'bar', seriesLayoutBy: 'row' , barWidth: 30 },
                    // These series are in the second grid.
                    { type: 'bar', xAxisIndex: 1, yAxisIndex: 1 , barWidth: 35},
                    { type: 'bar', xAxisIndex: 1, yAxisIndex: 1 , barWidth: 35},
                    { type: 'bar', xAxisIndex: 1, yAxisIndex: 1 , barWidth: 35},
                    { type: 'bar', xAxisIndex: 1, yAxisIndex: 1 , barWidth: 35}
                ]
            };

            // 使用刚指定的配置项和数据显示图表。
            myChart.setOption(option);
        })
</script>
</body>
</html>

这个通过读取 code/static/data/ genre-critic.json 中的数据,画出柱形图,显示总销量前五的专辑类型,在不同评分体系中的平均评分。

5)web程序启动

① 在另一个Ubuntu终端窗口中,用 hadoop 用户登录,在命令行运行su hadoop,并输入用户密码。
② 进入代码所在目录。
③ 在命令行运行如下命令:

spark-submit VisualizationFlask.py

④ 在浏览器打开 http://127.0.0.1:5000/,可看到如下界面:

使用Spark分析挖掘音乐专辑数据; 12-2

(1)各类型专辑的数量统计图

从图中可以看出Indie类型的专辑数量最多。

使用Spark分析挖掘音乐专辑数据; 各类型专辑的数量统计图; 12-3

(2)各类型专辑的销量统计图

该图统计了各个类型专辑的销量和,从图中可以看出Indie类型的专辑销量最高,将近47亿。Pop类型的专辑销量排在第二,约为39亿。

使用Spark分析挖掘音乐专辑数据; 各类型专辑的销量统计图; 12-4

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

使用Spark分析挖掘音乐专辑数据; 近20年每年发行的专辑数量和单曲数量统计图; 12-5

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

使用Spark分析挖掘音乐专辑数据; 总销量前五的专辑类型的各年份销量分析图; 12-6

(5)总销量前五的专辑类型的评分分析图

使用Spark分析挖掘音乐专辑数据; 总销量前五的专辑类型的评分分析图; 12-7

5.参考资料

【大数据技术与处理】推荐阅读

ShowMeAI 系列教程推荐

大数据之spark_spark的案例分析 计算订单分类成交金额 需求 在给定的订单数据,根据订单的分类ID进行聚合,然后按照订单分类名称,统计出某一天商品各个分类的成交金额 数据样例 {“cid”: 1, “money”: 600.0, “longitude”:116.397128,“latitude”:39.916527,“oid”:“o123”, } “oid”:“o112”, “cid”: 3, “money”: 200.0, “longitude”:118.396128,“latitude”:35.916527} {“oid”:“o124” 阅读详情

相关推荐

图解大数据技术:从入门到精通系列教程

本篇内容是ShowMeAI组织的「图解大数据处理与开发」系列教程入口,本教程以大数据技术为根基,给大家讲解大数据开发与数据处理分析的相关知识与技能,并配以相关的实战案例帮助大家学习理解。...

ShowMeAI研究中心 1万+

基于spark的音乐数据分析系统的设计与实现

本文主要对音乐数据,进行分析,系统技术主要使用,1.对原始数据集进行预处理;3.使用python语言编写Spark程序对HDFS中的数据进行处理分析,并把分析结果写入到MySQL数据库;4.利用Spark MLlib进行数据和关系预测;5.利用IntelliJ IDEA搭建动态Web应用;6.利用plotly进行前端可视化分析。关键词:音乐数据分析;可视化分析;python语言本文对网易云音乐平台的数据进行分析,分析年度音乐专辑销量TOP10;年度月排行榜榜首播放量;最受欢迎的音乐类型;

QQ2743785109的博客 3265

Spark 系列(六)Spark-GraphX的PageRank算法----热度排名的实例代码+图解展示

Spark GraphX 图算法: 一:PageRank模型: 每个网页为一个点 A到B的链接抽象为一条有向边 整张网页链接抽象成一份有向图 接下来我们通过一个转移矩阵来表示用户从页面i到页面j的可能性 M=[01201213001213120013010] M = \begin{bmatrix}0 & \frac{1}{2} & 0 & \frac{1}{2} \\\frac{1}{3} & 0 & 0 & \frac{1}{2} \\\frac{

qq_35050438的博客 2367

【Spark分布式内存计算框架——Spark SQL】7. 数据处理分析案例

其中使用SparkSQL中自带函数库functions,在org.apache.spark.sql.functions中,包含常用函数,有些与Hive中函数库类似,但是名称不一样。对电影评分数据进行统计分析,获取Top10电影(电影评分平均值最高,并且每个电影被评分的次数大于2000)。将分析结果数据保存到外部存储系统中,比如保存到MySQL数据库表中或者CSV文件中。第二步、转换数据,指定Schema信息,封装到DataFrame。第一步、读取电影评分数据,从本地文件系统读取。

优快云GuoYuying的博客 955

基于Spark的企业订单数据分析

大数据实验教学系统案例:企业订单数据分析现有某公司销售数据集,包含orders、order details和products数据。其中:830个orders和2,155个order details。现公司领导提出,希望大数据分析部门通过分析该销售数据集,回答以下问题: • 每个客户下了多少订单? • 每个国家的订单有多少? • 每月(年)有多少订单? • 每个客户的年销售总额是多少? • 客户每年的平均订单是多少?本案例用到的数据集说明如下:   订单数据集文件:/data/dataset/nw/NW-Or

需要远程指导仿真实验、代码有问题的,请后台私信或者关注公众号 3483

【信息科学与工程学】【解决方案体系】第三十篇 在线游戏及游戏云系统模型与方程式01

本表格旨在系统化地描述在线游戏及其云系统所涉及的各类数学模型、算法和定理。以下为前8个核心模型的详细示例,展示了从用户请求建模到资源规划的完整链条。编号规则为D(设计)、P(性能)、R(资源)、C(成本)、A(算法)。编号类别领域模型配方定理/算法/模型/方法名称定理/算法/模型/方法的逐步思考推理过程及每一个步骤的数学方程式和参数选择/参数优化精度/密度/误差/强度底层规律/理论定理典型应用场景和各类特征变量/常量/参数列表及说明数学特征。

weixin_49199313的博客 2301

客户流失?来看看大厂如何基于spark+机器学习构建千万数据规模上的用户留存模型 ⛵

如何在海量用户中精准预测哪些客户即将流失?本文结合音乐流媒体平台 Sparkify 数据,详细讲解一个客户流失建模预测案例的全流程:探索性数据分析 EDA、数据处理、进一步数据探索、建模优化、结果评估。【代码与数据集亲测可运行】........................

ShowMeAI研究中心 1万+

Spark大数据案例分析和介绍

hadoop spark parameter server 框架介绍,案例:计算广告、智慧城市、大数据背景下的金融产品定价

2026 届大数据专业毕设选题推荐,毕业设计题目汇总

042-springboot基于spring boot的软件学院学生成绩管理系统的设计与实现。186_springboot基于springboot的一个在线环保意识教育平台的设计与实现。springboot基于Spring Boot的食品安全信息管理系统的设计与实现7icc4。062-springboot基于springboot的青少年心理健康教育网站的设计与实现。069-springboot基于springboot的游戏创意工坊与推广平台的设计与实现。

JAVA编码选手的博客 2038

[毕业设计]基于Spark网易云音乐数据分析 .zip

[毕业设计]基于Spark网易云音乐数据分析 .zip 完整代码,可运行

Spotify歌曲数据集 CSV 5W+记录

该数据有 57,651 行和 5 列,列名 A、B、C 和 D,均为字符串类型。它提供了全面的数据集合,可以对其进行分析以深入了解 Spotify 库中歌曲的各个方面。

本科生毕业设计选题——计算机类

186_springboot基于springboot的一个在线环保意识教育平台的设计与实现。144_springboot基于 Springboot的社区康养管理系统的设计与实现。181_springboot基于Spring Boot的智慧养老服务系统的设计与实现。springboot基于Spring Boot和Vue的餐饮管理系统的设计与实现。161_springboot基于Java+Springboot的房屋租赁管理系统。springboot基于SpringBoot的高校科研工作管理系统的设计与实现。

xn19950718的博客 808

A毕业设计:基于Spark网易云音乐数据分析

基于Spark进行网易云音乐数据分析是一个有趣而且具有挑战性的项目。Spark是一个强大的分布式计算框架,适合处理大规模数据集,而网易云音乐作为一个庞大的音乐平台,拥有大量用户数据和音乐信息,可以通过Spark进行深入的数据分析和挖掘。以下是一些可能的数据分析方向和方法: 1. **用户行为分析**:通过分析用户在网易云音乐上的播放记录、收藏歌单、点赞评论等行为数据,可以了解用户的喜好、偏好以及活跃度,为个性化推荐提供参考。 2. **歌曲热度分析**:基于歌曲的播放量、下载量、收藏量等指标,分析各个歌曲的热度和流行度,帮助音乐平台了解用户对不同类型歌曲的喜爱程度。 3. **用户群体分析**:根据用户的年龄、性别、地域等信息对用户进行分组分析,了解不同群体的音乐偏好和行为特征,为精准营销和推荐提供支持。 4. **时段分析**:分析用户在不同时间段内的音乐偏好和活动情况,识别用户在特定时段内的使用模式,为合理安排推荐算法提供依据。 5. **情感分析**:基于用户评论和听歌历史数据,进行情感分析,了解用户对歌曲的喜欢程度、悦耳度等情感反馈,为推荐系统调整提供线索。 ...

2024-2025年计算机毕业设计选题推荐 -计算机专业毕业设计题目大全

本文系统梳理了基于不同技术栈的各类信息管理系统设计与实现案例,涵盖Web开发主流框架(Django、SpringBoot、Node.js等)构建的多元化应用场景。具体包括:1)Python/Django框架下的教育管理、电商推荐、数据分析等系统;2)SpringBoot生态中的智能充电、医疗健康、旅游服务等移动应用;3)Node.js技术实现的养老、校园、电商等服务平台;4)PHP/JSP等传统技术开发的律所管理、企业门户等系统。这些案例充分体现了现代信息技术在教育、医疗、商业等领域的深度融合,展示了大数据

G3259093417的博客 669

无人机通信安全渗透测试:从信号拦截到GPS欺骗的完整攻防框架

在物联网和智能设备普及的背景下,无线通信安全成为关键基础设施防护的核心环节。其原理在于,通过软件定义无线电等设备对空中的射频信号进行捕获、分析与模拟,从而评估通信协议在加密、认证和防重放等方面的脆弱性。这项技术的价值在于,它能主动发现并修复系统设计缺陷,避免因信号被拦截或欺骗导致设备被劫持、数据泄露等重大安全事件。其应用场景广泛,涵盖消费电子、工业控制及关键基础设施等领域。本文聚焦于无人机这一典型移动物联网终端,深入探讨如何构建一套针对其通信链路的渗透测试方法论,其中涉及信号拦截、协议逆向等关键技术,旨在为

weixin_34128237的博客 393

记一次Redis出问题及解决方案

Q1: redis服务关闭前确认数据还是在的,重启后发现一条数据都没了,key* 查也是空的 A1: 经仔细检查发现redis.conf配置文件配置的数据存储目录配置的是dir ./ 也就是相对目录,也就是说在哪个目录执行redis-server redis.config启动命令 redis数据就会存到哪个目录,同样就会加载哪个目录下的数据文件(dump.rdb),前后两次启动命令的位置不一样导致第二次启动没有加载到(dump.rdb)文件,从而导致查不出数据 Q2:springboot 集成r

u010013928的博客 3060

软件工程专业毕业设计选题大全 毕设指导

本文摘要了一系列基于Django、JSPM、Node.js、PHP、Python和SpringBoot框架开发的Web应用系统,涵盖多个领域:1)教育类(考研学习、在线考试、职业推荐);2)电商类(商城、二手交易、购物分析);3)管理系统(学生选课、人事管理、固定资产);4)数据分析(旅游景点、销售数据、气象预测);5)社交平台(音乐分享、动漫社区);6)公共服务(养老、医疗、法律援助)。这些系统充分发挥了各类技术栈的优势,如Django的后台处理能力、SpringBoot的微服务特性,针对特定行业需求提供

全网粉丝10W+、全栈领域优质创作者、掘金、阿里云等社区博客专家、专注于全栈领域和毕业项目实战 1378

[Linux项目实践] LCD Panel的硬件分析及调试

LCD硬件分析 项目使用3.5” TFT-LCD并且支持触摸控制。LCD的硬件可从几个方面学习:1)查看LCD的硬件连线。2)查看数据手册了解寄存器的控制。3)查看LCD DATASHEET了解硬件操作 1)LCD硬件连线 在图中有33个引脚,22根数据引脚和9根控制引脚。 LCD的工作原理:像素点是从左至右,从上至下逐个显示,LCD控制寄存器会从从内存中的framebuffer通

Terry_Yuan的技术专栏 3025

计算机专业毕业设计题目推荐(新颖选题)基于ai + SpringBoot相关的毕业设计选题

本文汇总了基于不同技术栈的毕业设计选题,涵盖Django、JSP、.NET、Node.js、PHP、Python和SpringBoot等技术框架。选题涉及教育、医疗、电商、旅游、农业等多个领域,如基于Django的考研学习系统和农业害虫识别系统,基于Node.js的养老院管理系统,基于SpringBoot的高校迎新系统和影院推荐系统等。这些系统设计结合了大数据分析、人工智能、Web开发等技术,展现了计算机技术在解决实际问题中的广泛应用,为计算机相关专业学生提供了丰富的毕业设计选题参考。

全网粉丝10W+、全栈领域优质创作者、掘金、阿里云等社区博客专家、专注于全栈领域和毕业项目实战 1640

用《Flappy Bird》游戏带你搞懂强化学习:从Q-learning到DQN的保姆级实战

本文通过《Flappy Bird》游戏实战,详细讲解了从Q-learning到DQN的强化学习技术。从环境搭建、Q表格构建到深度Q网络(DQN)的实现,逐步展示如何训练AI自主玩游戏。文章包含代码示例、训练技巧和性能优化方法,帮助读者深入理解强化学习的核心概念和应用。

weixin_42526415的博客 347

Intel Mobileye EyeQ Ultra:RISC-V架构的L4自动驾驶芯片解析

RISC-V作为开源指令集架构,凭借其模块化设计和可定制特性,正在重塑高性能计算领域。其精简指令集带来的确定性执行时序,特别适合自动驾驶等实时性要求严苛的场景。在异构计算架构中,RISC-V与专用加速器(如NPU、GPU)的协同设计,能显著提升能效比和算力密度。Mobileye EyeQ Ultra采用12核RISC-V集群,结合176TOPS AI加速器和5nm工艺,实现了L4级自动驾驶所需的实时感知与决策能力。这种架构为车载计算平台提供了可扩展的解决方案,同时降低了系统复杂度和BOM成本。

weixin_33245447的博客 428

2025-2026年计算机毕业设计选题推荐:200+个热门精品毕设题目

042-springboot基于spring boot的软件学院学生成绩管理系统的设计与实现。186_springboot基于springboot的一个在线环保意识教育平台的设计与实现。springboot基于Spring Boot的食品安全信息管理系统的设计与实现7icc4。062-springboot基于springboot的青少年心理健康教育网站的设计与实现。069-springboot基于springboot的游戏创意工坊与推广平台的设计与实现。

xn19950718的博客 4216

从零开始学版图(二)-----------差分放大电路

从零开始学版图

m0_56112720的博客 8566
上一篇: 图解大数据 | 综合案例-使用Spark分析挖掘零售交易数据
下一篇: 图解大数据 | 流式数据处理-Spark Streaming
ShowMeAI
博客等级 码龄5年 6514粉丝 672原创
评论 6
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ShowMeAI

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值