基于MapReduce的京东20年口红数据的分析与实现

news2024/11/26 18:53:20

基于MapReduce的京东20年口红数据的分析与实现

文章目录

  • 基于MapReduce的京东20年口红数据的分析与实现
    • 一、前言
    • 二、数据可视化
      • 1、安装Python和Flask框架
      • 2、创建Flask应用程序
      • 3、创建基于Echarts的网页展示代码
      • 4、最终结果
    • 三、最后我想说

一、前言

这是一个利用Hadoop+MapReduce+JAVA进行数据处理+Python flask+Echarts进行分析与前端可视化实现的一个小项目,整个任务的实现大致分为如下几个步骤:

  1. 准备工作:
    • 在Linux系统上安装Hadoop并配置环境变量。
    • 在Hadoop集群中启动HDFS和YARN服务。
  2. 上传数据文件到HDFS:
    • 将电商数据信息数据上传到HDFS文件系统中。
  3. 编写MapReduce任务程序:
    • 创建一个Java项目,导入Hadoop相关的库。
    • 编写Mapper类,实现Map阶段任务编程,解析每行数据并发射(emit)商品名称和销量(评价人数)作为键值对。
    • 编写Reducer类,实现Reduce阶段编程,对相同商品名称的销量进行累加。
    • 编写Driver类,设置输入路径、输出路径,配置Mapper和Reducer类,并提交MapReduce任务。
  4. 运行MapReduce任务:
    • 将Java项目打包为可执行的JAR文件。
    • 使用以下命令提交MapReduce任务到YARN集群进行执行。
  5. 数据可视化:
    • 安装Python和Flask框架。
    • 创建一个Flask应用程序,编写路由和视图函数。
    • 在视图函数中读取MapReduce任务的输出结果文件,解析数据。
    • 使用Echarts可视化库,将数据可视化并在网页中展示。

其中前四步操作跟我之前写的一篇博客基本一致,其中几个JAVA代码基本都是在前面的基础上进行稍加修改的,所以我重点介绍后面几步的实现以及所遇见的问题解决办法。

前四步不会的朋友可以移步去看一下我之前的博客:云计算中的大数据处理:尝试HDFS和MapReduce的应用

本次小项目用到的数据集是**京东口红数据集**,来自和鲸官网的一名博主,数据共3000条京东口红的商品数据,包括商品名称,商品价格,店铺名称,评价人数,商品标签。

在这里插入图片描述

本次实验主要分析统计每种商品的销量。

二、数据可视化

1、安装Python和Flask框架

Flask是一个轻量级的Python web框架,用于快速开发Web应用程序。它是一个简单的、易于学习和使用的框架,适合用于小型和中型项目,Flask非常轻量级,没有复杂的依赖关系,只需要最基本的Python环境即可运行。

下面是在Linux环境中下载Flask框架的步骤:

  • 安装pip3,一般CentOS7都会自带。

  • 安装virtunlenv

    pip3 install virtualenv --index-url=https://pypi.org/simple/
    

    这样下载可以避免网络问题。

  • 配置虚拟项目

    依次在自定义的目录中执行如下命令:

    mkdir myproject
    cd myproject
    virtualenv env
    . env/bin/activate
    

    这样就会激活Python虚拟环境。

  • 安装Flask

  • 直接使用pip3命令安装:

    pip3 install Flask
    

到这里Flask框架就安装完成了。

2、创建Flask应用程序

建立一个py程序在你创建的虚拟项目的根目录中:

from flask import Flask, render_template

app = Flask(__name__)

@app.route('/')
def index():
    # 读取数据文件
    with open('/root/jdkh/part-r-00000', 'r', encoding='utf-8') as file:
        data = file.readlines()

    # 处理数据
    product_sales = []
    for line in data:
        line = line.strip()
        parts = line.split('\t')
        if len(parts) == 2:
            product_sales.append((parts[0].strip('"'), int(parts[1])))

    # 按销量排序并获取前十
    top_10_products = sorted(product_sales, key=lambda x: x[1], reverse=True)[:10]

    # 提取商品名称和销量
    product_names = [item[0] for item in top_10_products]
    sales = [item[1] for item in top_10_products]

    return render_template('jdkh-20y.html', product_names=product_names, sales=sales)

if __name__ == '__main__':
    app.run(host='0.0.0.0')

请注意代码中的最后主函数中的这段代码:

app.run(host='0.0.0.0')

需要注意的是flask的app.run()方法是运行服务器应用,默认是只能在本机访问的,所以如果需要在其他机器上访问,需要修改为:app.run(host=‘0.0.0.0’)否则后续将无法访问到我们的网页。

3、创建基于Echarts的网页展示代码

首先我们在Python虚拟项目中创建一个名为templates的文件夹,然后在templates文件夹中创建一个名为xxx.html的文件,其用于我们在xxx.html文件中编写HTML代码,用于呈现数据可视化。请确保templates的文件夹和你创建的py程序位于同一目录下,如果不在一个目录中会出现TemplateNotFound的异常。

下面是一个简单的前端展示代码:

<!DOCTYPE html>
<html>
<head>
    <title>商品销量统计</title>
    <style>
        body {
            display: flex;
            justify-content: center;
            align-items: center;
            height: 100vh;
        }

        .chart-container {
            display: flex;
            flex-direction: column;
            align-items: center;
            justify-content: center;
        }
    </style>
    <script src="https://cdn.staticfile.org/echarts/5.1.2/echarts.min.js"></script>
</head>
<body>
    <div class="chart-container">
        <div id="barChart" style="width: 800px; height: 600px;"></div>
        <div id="pieChart" style="width: 600px; height: 400px;"></div>
    </div>

    <script>
        // 提取商品名称和销量
        var productNames = {{ product_names|tojson }};
        var sales = {{ sales|tojson }};

        // 初始化echarts实例
        var barChart = echarts.init(document.getElementById('barChart'));
        var pieChart = echarts.init(document.getElementById('pieChart'));

        // 配置柱状图选项
        var barOptions = {
            title: {
                text: '商品销量统计',
                left: 'center'
            },
            grid: {
                left: '10%',
                right: '10%',
                bottom: '10%',
                containLabel: true
            },
            xAxis: {
                data: productNames,
                axisLabel: {
                    rotate: 45,  // 旋转45度以避免标签重叠
                    interval: 0  // 强制显示所有标签
                }
            },
            yAxis: {},
            series: [{
                name: '销量',
                type: 'bar',
                data: sales,
                itemStyle: {
                    color: function (params) {
                        // 自定义颜色,根据不同的商品选择不同的颜色
                        var colors = ['#FF0000', '#00FF00', '#0000FF', '#FFFF00', '#FF00FF', '#00FFFF', '#000000', '#808080', '#800000', '#008000'];
                        return colors[params.dataIndex % colors.length];
                    }
                }
            }]
        };

        // 配置饼图选项
        var pieOptions = {
            title: {
                text: '商品销量占比',
                left: 'center'
            },
            tooltip: {
                trigger: 'item',
                formatter: '{b}: {c}%'
            },
            legend: {
                orient: 'vertical',
                left: 'left',
                data: productNames
            },
            series: [{
                name: '销量占比',
                type: 'pie',
                radius: '55%',
                center: ['50%', '60%'],
                data: sales.map(function (value, index) {
                    return {
                        name: productNames[index],
                        value: value
                    };
                }),
                label: {
                    formatter: '{b}: {c}%'
                }
            }]
        };

        // 使用刚指定的配置项和数据显示柱状图和饼图
        barChart.setOption(barOptions);
        pieChart.setOption(pieOptions);
    </script>
</body>
</html>

这段代码会在页面上显示一个柱状图和一个饼图,柱状图显示了商品销量的统计信息,横坐标显示商品名称,纵坐标显示销量。饼图显示了商品销量的占比信息,每个扇区代表一个商品,扇区的大小。

4、最终结果

我们py和html程序都编写完成之后,我们直接在py项目的根目录下执行运行命令:

python3 xxx.py

出现如下信息代表运行成功:在这里插入图片描述

然后我们复制红框所选的网址到我们的浏览器地址栏中回车就可以得到我们在前端显示的可视化内容了。

在这里插入图片描述

可以看见出现我们想要的可视化内容,不太美规,大家还可以自行优化一下,因为本人不太擅长前端所以就制作成这个效果了。

三、最后我想说

在实验最前面的步骤:上传数据文件到HDFS中,我们在本地需要将CSV文件按如下格式进行保存,不然会出现乱码问题:

在这里插入图片描述

其次可能还会遇见的问题有:将文件上传到linux之后查看文件发现文件的每一行末尾都有一个符号:^M,这是因为dos和linux采用了不同的换行导致的,linux是用的\n,而dos是用的\n\r,所以才会出现这样的情况,解决这个问题的我觉得最简单的办法就是如下两步:

  1. 安装dos2unix工具

    yum install dos2unix -y
    
  2. 用dos2unix命令进行转换

    dos2unix filename
    

这样我们再次查看我们的数据文件时就没有那个符号了,我们就可以接下来的任务实现。

好啦,本期实验到这里就结束了,本人考研任务繁多,后续更新博客看时间充裕情况,还请谅解,最后祝各位大朋友小朋友六一儿童节快乐,我们下次再见😎

(需要项目代码的可以私信我)
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/598513.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java设计模式(二)

系列文章目录 里氏替换原则 开闭原则 文章目录 系列文章目录前言一、里氏替换原则1.OO中的继承性的思考和说明2.里氏替换原则基本介绍 二、开闭原则1.开闭原则基本介绍 总结 前言 大家好呀&#xff0c;欢迎来到柚子的博客~让我们一起成长吧o(&#xffe3;▽&#xffe3;)ブ 提…

二、浏览器广告屏蔽插件_Adblock Plus

1、浏览器广告 在浏览器浏览内容时&#xff0c;有广告无可厚非&#xff0c;但有些网页做的太过分了。如广告影响了正常网页的浏览&#xff1b;广告内容低俗恶心。特推荐以下浏览器广告屏蔽插件。 2、浏览器广告屏蔽插件 2.1、Adblock Plus 简介 (1)这里推荐Adblock Plus插件…

有哪些代码调试工具推荐? - 易智编译EaseEditing

下面是一些常用的代码调试工具&#xff0c;它们可以帮助开发人员识别和解决代码中的问题&#xff1a; 调试器(Debugger)&#xff1a; 调试器是一种强大的工具&#xff0c;用于在代码执行过程中逐行执行和检查代码。它允许您设置断点、观察变量的值、跟踪函数调用和返回等。 …

通义千悟-阿里通义千问系列

【通义听悟】我发现了一个宝藏产品&#xff0c;推荐给你&#xff5e; https://tingwu.aliyun.com/u/T1YJJcJcc0030c30 工作学习AI助手&#xff0c;依托大模型&#xff0c;为每一个人提供全新的音视频体验。点击链接立即注册&#xff0c;公测期免费体验。 阿里的通义千问系列 …

Spring Boot如何实现分布式任务调度?

Spring Boot如何实现分布式任务调度&#xff1f; 随着互联网的快速发展&#xff0c;越来越多的企业开始将自己的业务迁移到分布式系统中。在这种情况下&#xff0c;分布式任务调度变得尤为重要。对于分布式系统中的每个任务来说&#xff0c;它需要在多个节点上定时执行&#x…

VMware虚拟机最新详细安装保姆级教程(2023年新版教程)

VMware最新详细安装保姆级教程&#xff08;2023年新版教程&#xff09; 大家好&#xff0c;我是洲洲&#xff0c;欢迎关注&#xff0c;一个爱听周杰伦的程序员。关注公众号【程序员洲洲】即可获得10G学习资料、面试笔记、大厂独家学习体系路线等…还可以加入技术交流群欢迎大…

华为OD机试真题 Java 实现【获得完美走位】【2023Q1 100分】

一、题目描述 在第一人称射击游戏中&#xff0c;玩家通过键盘的 A、S、D、W 四个按键控制游戏人物分别向左、向后、向右、向前进行移动&#xff0c;从而完成走位假设玩家每按动一次键盘&#xff0c;游戏任务会向某个方向移动一步&#xff0c;如果玩家在操作一定次数的键盘并且…

曾经作为程序员的你为什么不当程序员了?现在在做什么?

去年年底&#xff0c;我把老板开了。因为实在干不下去了。 当时正赶着公司的新产品上线&#xff0c;整个团队都在通宵加班改bug&#xff0c;好不容易才在预定时间内上线&#xff0c;我们都想着能够喘口气了&#xff0c;甚至已经约好了今晚的海底捞&#xff0c;想着请大伙儿搓一…

Go中同/异步与锁的应用~~sync包

Go中锁的实现~~sync包 go中sync包中提供了互斥锁; 在前面Go中channel文章中我们使用了time.Sleep()函数使得main函数的Goroutine阻塞至所有协程Goroutine结束,但这并不是一个很好的办法,因为我们实际应用中并不能准确知道协程什么时候结束(这里面要考虑服务器的性能,网络波动以…

日志脱敏之后,无法根据信息快速定位怎么办?

日志脱敏之殇 小明同学在一家金融公司上班&#xff0c;为了满足安全监管要求&#xff0c;最近天天忙着做日志脱敏。 无意间看到了一篇文章金融用户敏感数据如何优雅地实现脱敏&#xff1f; 感觉写的不错&#xff0c;用起来也很方便。 不过日志脱敏之后&#xff0c;新的问题就…

将Parquet文件的数据导入Hive 、JSON文件导入ES

文章目录 将Parquet文件的数据导入Hive查询parquet文件格式编译cli工具查看元数据信息查询抽样数据 创建hive表 数据存储格式采用parquet加载文件 将json数据导入ESES批量导入api原始json文件内容索引结构重组json脚本重组后的json文件bulk api调用 将Parquet文件的数据导入Hiv…

Spring Boot如何实现分布式文件系统

Spring Boot如何实现分布式文件系统 随着数据量的不断增长&#xff0c;单机文件系统已经无法满足大规模数据存储和访问的需求&#xff0c;因此分布式文件系统变得越来越重要。本文将介绍如何使用 Spring Boot 实现分布式文件系统。 1. 分布式文件系统的设计 分布式文件系统是…

【JavaSE】Java基础语法(四十):UDP通信程序

文章目录 1. UDP发送数据2. UDP接收数据【应用】3. UDP通信程序练习【应用】4. UDP三种通讯方式 1. UDP发送数据 Java中的UDP通信 UDP协议是一种不可靠的网络协议&#xff0c;它在通信的两端各建立一个Socket对象&#xff0c;但是这两个 Socket只是发送&#xff0c;接收数据的对…

Doris的一些进阶用法

6.doris进阶 6.1修改表 6.1.1修改表名 示例&#xff1a; 将名为 table1 的表修改为 table2 SQLALTER TABLE table1 RENAME table2; -- 示例 ALTER TABLE aggregate_test RENAME aggregate_test1; 将表 example_table 中名为 rollup1 的 rollup index 修改为 rollup2 SQLA…

V2board 1.6.1 提权漏洞(web缓存投毒)

目录 复现环境&#xff1a; 漏洞产生的原因&#xff1a; 漏洞的利用以及复现&#xff1a; 复现环境&#xff1a; 在gethub中直接拉去docker镜像 vulhub/README.zh-cn.md at master vulhub/vulhub GitHub 漏洞产生的原因&#xff1a; 前端的认证方式与后端并没有进行区分…

【LeetCode热题100】打卡第9天:电话号码的字母组合

文章目录 电话号码的字母组合⛅前言&#x1f512;题目&#x1f511;题解 电话号码的字母组合 ⛅前言 大家好&#xff0c;我是知识汲取者&#xff0c;欢迎来到我的LeetCode热题100刷题专栏&#xff01; 精选 100 道力扣&#xff08;LeetCode&#xff09;上最热门的题目&#xf…

本地运行 LLAMA GPT-3.5-TURBO开源项目

git&#xff1a; nomic-ai/gpt4all: gpt4all: an ecosystem of open-source chatbots trained on a massive collections of clean assistant data including code, stories and dialogue (github.com) 下载好源码后&#xff0c;的目录结构&#xff1a; 视频中说的 chat 目录…

视图和用户管理

目录 视图基本使用视图规则和限制 用户管理用户用户信息创建用户删除用户修改用户密码 数据库的权限给用户授权回收权限 视图 视图是一个虚拟表&#xff0c;其内容由查询定义。同真实的表一样&#xff0c;视图包含一系列带有名称的列和行数据。视图的数据变化会影响到基表&…

基于Python的接口自动化-构建mock接口服务

引言 Mock 即模拟&#xff0c;就是在测试过程中&#xff0c;对于某些不容易构造或者不容易获取的对象&#xff0c;用一个虚拟的对象来创建以便测试的测试方法&#xff0c;其最大的优势就是降级前后端耦合度&#xff0c; 使前端工程师可以不依赖后端返回数据&#xff0c;先开发前…

堆排序及top k 问题

目录 一&#xff1a;堆排序 1.向上调整建堆 2.向下调整建堆 3.向上调整建堆时间复杂度 4.向下调整建堆时间复杂度 二&#xff1a;找 top k 问题 1.造数据 2.进行建堆&#xff0c;查找最大的K个数据 一&#xff1a;堆排序 升序 --- 建大堆 --- 每个父亲节点 > 孩子节…