ToB企服应用市场:ToB评测及商务社交产业平台

标题: 基于Hadoop的网购笔记本电脑大数据分析与可视化系统 [打印本页]

作者: 熊熊出没    时间: 2024-8-17 22:38
标题: 基于Hadoop的网购笔记本电脑大数据分析与可视化系统
有需要本项目标代码或文档以及全部资源,或者部署调试可以私信博主

项目介绍

本项目首先通过爬虫获取京东电脑数据,爬虫比力OK,非常具有学习意义,数据可以不停地获取,智能化爬虫,遵守协议,属于良性获取数据。
然后举行数据预处置惩罚,将脏数据举行结构化处置惩罚,保证大数据Hadoop可以复用
采用Hadoop举行大数据分析 设计组件集群 hdfs HIve flume sqoop MySQL 等
末了使用Python调用Echarts 使用Pyecharts举行web可视化
数据收罗过程

这个爬虫的主要特点是:

数据预处置惩罚

  1. import pandas as pd
  2. import numpy as np
  3. # 加载数据
  4. df = pd.read_csv('./data/jd_products48.csv', encoding='utf-8-sig')
  5. # 查看数据基本信息
  6. print(df.info())
  7. print(df.describe())
  8. # 检查缺失值
  9. print(df.isnull().sum())
复制代码
  1. # 对于数值型列,用中位数填充缺失值
  2. numeric_columns = df.select_dtypes(include=[np.number]).columns
  3. for col in numeric_columns:
  4.     df[col].fillna(df[col].median(), inplace=True)
  5. # 对于分类型列,用众数填充缺失值
  6. categorical_columns = df.select_dtypes(include=['object']).columns
  7. for col in categorical_columns:
  8.     df[col].fillna(df[col].mode()[0], inplace=True)
复制代码
  1. # 将价格列转换为数值类型
  2. df['价格'] = df['价格'].str.replace('¥', '').astype(float)
  3. # 将评论数转换为数值类型
  4. df['评论数'] = df['评论数'].str.replace('+', '').str.replace('万', '0000').astype(int)
复制代码
  1. # 创建新的特征:价格区间
  2. df['价格区间'] = pd.cut(df['价格'], bins=[0, 1000, 3000, 5000, 10000, np.inf],
  3.                     labels=['低端', '中低端', '中端', '中高端', '高端'])
  4. # 提取品牌信息
  5. df['品牌'] = df['商品名称'].str.split().str[0]
  6. # 创建是否是游戏本的标志
  7. df['是否游戏本'] = df['商品名称'].str.contains('游戏本|电竞').astype(int)
复制代码
  1. # 使用 IQR 方法检测并处理异常值
  2. def remove_outliers(df, column):
  3.     Q1 = df[column].quantile(0.25)
  4.     Q3 = df[column].quantile(0.75)
  5.     IQR = Q3 - Q1
  6.     lower_bound = Q1 - 1.5 * IQR
  7.     upper_bound = Q3 + 1.5 * IQR
  8.     df = df[(df[column] >= lower_bound) & (df[column] <= upper_bound)]
  9.     return df
  10. df = remove_outliers(df, '价格')
复制代码
  1. from sklearn.preprocessing import StandardScaler
  2. scaler = StandardScaler()
  3. df['价格_标准化'] = scaler.fit_transform(df[['价格']])
复制代码
  1. # 提取处理器信息
  2. df['处理器类型'] = df['处理器(CPU)'].str.extract('(i\d|锐龙)')
  3. # 提取内存大小
  4. df['内存大小'] = df['内存容量'].str.extract('(\d+)').astype(float)
复制代码
  1. df.drop_duplicates(subset='商品编号', keep='first', inplace=True)
复制代码
  1. df.to_csv('./data/jd_products_processed.csv', index=False, encoding='utf-8-sig')
复制代码
这个数据预处置惩罚过程包罗了处置惩罚缺失值、数据范例转换、特性工程、非常值处置惩罚、数据标准化、文本数据处置惩罚和数据去重等步骤。这些步骤可以或许帮助清理原始数据,并为后续的数据分析和建模做好准备。根据实际数据的特点和分析需求,您大概需要调整或添加一些特定的预处置惩罚步骤。

Hadoop大数据分析


下面只是一个案例过程,真正的代码如上图所示,脚本已经封装好了,一键化运行
  1. # 假设您的处理后的CSV文件位于本地的 /path/to/jd_products_processed.csv
  2. hadoop fs -put /path/to/jd_products_processed.csv /user/hadoop/jd_data/
复制代码
首先,创建一个 Flume 设置文件 jd_flume.conf:
  1. # 定义源、通道和接收器
  2. agent.sources = csv_source
  3. agent.channels = memory_channel
  4. agent.sinks = hive_sink
  5. # 配置源(CSV文件)
  6. agent.sources.csv_source.type = spooldir
  7. agent.sources.csv_source.spoolDir = /user/hadoop/jd_data/
  8. agent.sources.csv_source.fileHeader = true
  9. # 配置通道
  10. agent.channels.memory_channel.type = memory
  11. agent.channels.memory_channel.capacity = 10000
  12. agent.channels.memory_channel.transactionCapacity = 1000
  13. # 配置接收器(Hive)
  14. agent.sinks.hive_sink.type = hive
  15. agent.sinks.hive_sink.hive.metastore = thrift://localhost:9083
  16. agent.sinks.hive_sink.hive.database = jd_database
  17. agent.sinks.hive_sink.hive.table = jd_products
  18. agent.sinks.hive_sink.useLocalTimeStamp = true
  19. # 将源和接收器与通道关联
  20. agent.sources.csv_source.channels = memory_channel
  21. agent.sinks.hive_sink.channel = memory_channel
复制代码
然后,启动 Flume 署理:
  1. flume-ng agent --conf-file jd_flume.conf --name agent -Dflume.root.logger=INFO,console
复制代码
首先,创建 Hive 表:
  1. CREATE TABLE jd_products (
  2.     价格 FLOAT,
  3.     名称 STRING,
  4.     评论数 INT,
  5.     店铺名 STRING,
  6.     品牌 STRING,
  7.     商品名称 STRING,
  8.     商品编号 STRING,
  9.     处理器 STRING,
  10.     内存容量 STRING,
  11.     硬盘容量 STRING,
  12.     显卡 STRING,
  13.     系统 STRING,
  14.     价格区间 STRING,
  15.     是否游戏本 INT
  16. ) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' STORED AS TEXTFILE;
复制代码
然后,举行一些示例分析:
  1. -- 各品牌的平均价格
  2. SELECT 品牌, AVG(价格) as 平均价格
  3. FROM jd_products
  4. GROUP BY 品牌
  5. ORDER BY 平均价格 DESC
  6. LIMIT 10;
  7. -- 各价格区间的商品数量
  8. SELECT 价格区间, COUNT(*) as 商品数量
  9. FROM jd_products
  10. GROUP BY 价格区间
  11. ORDER BY 商品数量 DESC;
  12. -- 游戏本vs非游戏本的平均价格
  13. SELECT 是否游戏本, AVG(价格) as 平均价格
  14. FROM jd_products
  15. GROUP BY 是否游戏本;
  16. -- 评论数最多的前10款产品
  17. SELECT 商品名称, 评论数
  18. FROM jd_products
  19. ORDER BY 评论数 DESC
  20. LIMIT 10;
复制代码
首先,在 MySQL 中创建目标表:
  1. CREATE TABLE jd_products (
  2.     价格 FLOAT,
  3.     名称 VARCHAR(255),
  4.     评论数 INT,
  5.     店铺名 VARCHAR(255),
  6.     品牌 VARCHAR(255),
  7.     商品名称 VARCHAR(255),
  8.     商品编号 VARCHAR(255),
  9.     处理器 VARCHAR(255),
  10.     内存容量 VARCHAR(255),
  11.     硬盘容量 VARCHAR(255),
  12.     显卡 VARCHAR(255),
  13.     系统 VARCHAR(255),
  14.     价格区间 VARCHAR(50),
  15.     是否游戏本 INT
  16. );
复制代码
然后,使用 Sqoop 导出数据:
  1. sqoop export --connect jdbc:mysql://localhost:3306/jd_database \
  2. --username your_username --password your_password \
  3. --table jd_products --export-dir /user/hive/warehouse/jd_database.db/jd_products \
  4. --input-fields-terminated-by ',' --input-lines-terminated-by '\n'
复制代码
首先,创建一个 PHP 文件来从 MySQL 获取数据并返回 JSON 格式:
  1. <?php
  2. $servername = "localhost";
  3. $username = "your_username";
  4. $password = "your_password";
  5. $dbname = "jd_database";
  6. $conn = new mysqli($servername, $username, $password, $dbname);
  7. if ($conn->connect_error) {
  8.     die("连接失败: " . $conn->connect_error);
  9. }
  10. $sql = "SELECT 品牌, AVG(价格) as 平均价格 FROM jd_products GROUP BY 品牌 ORDER BY 平均价格 DESC LIMIT 10";
  11. $result = $conn->query($sql);
  12. $data = array();
  13. while($row = $result->fetch_assoc()) {
  14.     $data[] = $row;
  15. }
  16. echo json_encode($data);
  17. $conn->close();
  18. ?>
复制代码
然后,创建一个 HTML 文件使用 ECharts 举行可视化:
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4.     <title>JD产品数据分析</title>
  5.     <script src="https://cdn.jsdelivr.net/npm/echarts@5.0.0/dist/echarts.min.js"></script>
  6.     <script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
  7. </head>
  8. <body>
  9.     <div id="main" style="width: 600px;height:400px;"></div>
  10.     <script type="text/javascript">
  11.         var myChart = echarts.init(document.getElementById('main'));
  12.         
  13.         $.get('get_data.php', function (data) {
  14.             var brands = data.map(item => item.品牌);
  15.             var prices = data.map(item => item.平均价格);
  16.             
  17.             var option = {
  18.                 title: {
  19.                     text: '各品牌平均价格'
  20.                 },
  21.                 tooltip: {},
  22.                 legend: {
  23.                     data:['平均价格']
  24.                 },
  25.                 xAxis: {
  26.                     data: brands
  27.                 },
  28.                 yAxis: {},
  29.                 series: [{
  30.                     name: '平均价格',
  31.                     type: 'bar',
  32.                     data: prices
  33.                 }]
  34.             };
  35.             myChart.setOption(option);
  36.         }, 'json');
  37.     </script>
  38. </body>
  39. </html>
复制代码
这个完整的流程涵盖了从数据上传到 HDFS、使用 Flume 加载到 Hive、举行 Hive 分析、使用 Sqoop 导出到 MySQL,末了使用 ECharts 举行可视化的整个过程。
可视化展示








每文一语

   每一次的注解都是最好的回忆教科书

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4