这是一个利用Hadoop+MapReduce+JAVA进行数据处理+Python flask+Echarts进行分析与前端可视化实现的一个小项目,整个任务的实现大致分为如下几个步骤:
其中前四步操作跟我之前写的一篇博客基本一致,其中几个JAVA代码基本都是在前面的基础上进行稍加修改的,所以我重点介绍后面几步的实现以及所遇见的问题解决办法。
前四步不会的朋友可以移步去看一下我之前的博客:云计算中的大数据处理:尝试HDFS和MapReduce的应用
本次小项目用到的数据集是**京东口红数据集**,来自和鲸官网的一名博主,数据共3000条京东口红的商品数据,包括商品名称,商品价格,店铺名称,评价人数,商品标签。
本次实验主要分析统计每种商品的销量。
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框架就安装完成了。
建立一个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’)否则后续将无法访问到我们的网页。
首先我们在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>
这段代码会在页面上显示一个柱状图和一个饼图,柱状图显示了商品销量的统计信息,横坐标显示商品名称,纵坐标显示销量。饼图显示了商品销量的占比信息,每个扇区代表一个商品,扇区的大小。
我们py和html程序都编写完成之后,我们直接在py项目的根目录下执行运行命令:
python3 xxx.py
然后我们复制红框所选的网址到我们的浏览器地址栏中回车就可以得到我们在前端显示的可视化内容了。
可以看见出现我们想要的可视化内容,不太美规,大家还可以自行优化一下,因为本人不太擅长前端所以就制作成这个效果了。
在实验最前面的步骤:上传数据文件到HDFS中,我们在本地需要将CSV文件按如下格式进行保存,不然会出现乱码问题:
其次可能还会遇见的问题有:将文件上传到linux之后查看文件发现文件的每一行末尾都有一个符号:^M,这是因为dos和linux采用了不同的换行导致的,linux是用的\n,而dos是用的\n\r,所以才会出现这样的情况,解决这个问题的我觉得最简单的办法就是如下两步:
安装dos2unix工具
yum install dos2unix -y
用dos2unix命令进行转换
dos2unix filename
这样我们再次查看我们的数据文件时就没有那个符号了,我们就可以接下来的任务实现。
好啦,本期实验到这里就结束了,本人考研任务繁多,后续更新博客看时间充裕情况,还请谅解,最后祝各位大朋友小朋友六一儿童节快乐,我们下次再见