这篇直接给一个适合大数据方向毕设的选题方案:Python + Spark + Hadoop 实现的淘宝化妆品数据分析系统。选这个题的关键在于“数据容易理解、技术栈覆盖全、工作量可控、可视化效果好”,这几点正好是答辩前最重要的判断维度。
本文会把系统拆开讲清楚:技术栈怎么分工、数据怎么准备、离线分析做哪些、机器学习用什么模型、可视化界面怎么搭、部署和验收要盯哪些指标,最后补充时间规划和排错清单。无论你是大数据、数据科学、计算机还是电商相关专业,只要想找一个能完整展示 Hadoop + Spark + 机器学习能力、又不至于做不完全的毕设项目,这个题目值得认真考虑。
1. 核心能力速览
| 项目 | 说明 |
|---|---|
| 选题类型 | 大数据分析与可视化类毕业设计 |
| 建议技术栈 | Python + Hadoop + Spark + MySQL + Flask + ECharts |
| 系统核心功能 | 数据清洗、离线统计、品牌/价格/销量分析、机器学习销量预测、可视化大屏 |
| 数据来源 | 公开数据集、自造模拟数据;真实采集必须遵守平台服务条款和授权规范 |
| 部署环境 | 单机伪分布式或 3 节点虚拟机集群 |
| 交互形式 | Web 页面 + REST 接口 |
| 机器学习模块 | Spark MLlib 回归、分类、评论文本情感分析 |
| 适合人群 | 大数据、数据科学、计算机、电商相关专业学生 |
这个题目最大的优点是每一个技术组件都有明确的用途,不会出现“为了用 Hadoop 而用 Hadoop”的尴尬。HDFS 负责数据存储,Spark 负责离线清洗和统计分析,Spark MLlib 负责销量预测模型,MySQL 存储分析结果,Flask 提供后端接口,ECharts 负责展示。整套链路跑通后,论文里可以画出一张完整的技术架构图,答辩时可以按数据流向一步步讲清楚。
2. 适用学生群体与能力门槛
这个选题适合以下三类学生:
- 正在准备大数据方向毕业设计,想找一个覆盖面广、容易展示的项目。
- 有一定 Python 基础,想通过实战把 Hadoop 和 Spark 串起来的同学。
- 电子商务、数据科学等专业,需要对电商场景做过实际分析的同学。
需要你至少具备以下能力:
- Python 基础语法,特别是 pandas 或 PySpark DataFrame 的基本操作。
- 基本 SQL 能力,包括 group by、join、聚合函数。
- Linux 常用命令,比如 cd、vim、tar、chmod。
- 能接受“环境搭建占整个项目 1/3 时间”的现实。
如果你的情况是“完全没有接触过 Linux,也没写过 Python 代码”,那我建议先花两周完成 Python 入门和 Linux 基础训练,再启动这个项目,否则环境报错会严重影响进度。
3. 系统整体架构与技术选型
系统整体可以分成五层:
- 数据层:CSV 或 JSON 格式的电商化妆品商品数据,通过 Python 脚本写入 HDFS。
- 存储层:HDFS 存放原始数据,MySQL 存放分析结果和 Web 端查询表。
- 计算层:Spark Core + Spark SQL 做离线清洗、聚合统计;Spark MLlib 做机器学习建模。
- 服务层:Flask 提供 JSON 接口,向外暴露统计结果和预测结果。
- 展示层:ECharts 在页面中绘制柱状图、折线图、饼图、散点图等。
组件选型如下:
| 组件 | 说明 |
|---|---|
| Hadoop 3.x | HDFS 分布式存储,YARN 调度资源 |
| Spark 3.x | 离线批处理,PySpark 编写分析任务 |
| MySQL 5.7/8.0 | 存储统计结果、商品明细、用户账号 |
| Flask | 轻量级 Web 后端 |
| ECharts | 前端图表库 |
| Python 3.8+ | 数据处理脚本、Web 服务、算法集成 |
部署方面有两种选择:
- 单机伪分布式:适合学生笔记本,环境简单,Hadoop 在一个 JVM 进程中模拟分布式。数据量在几万条时可以稳定跑完。
- 三节点集群:用 3 台虚拟机分别做 NameNode + DataNode、DataNode、DataNode。更贴近生产环境,但也需要投入更多时间处理网络和配置问题。
建议优先用单机伪分布式跑通全流程,再按资源情况决定要不要升级为集群。
4. 数据准备与预处理思路
4.1 数据字段设计
淘宝化妆品场景下,核心数据字段建议包含这些:
| 字段名 | 类型 | 含义 |
|---|---|---|
| item_id | 字符串 | 商品唯一标识 |
| title | 字符串 | 商品标题 |
| price | 浮点数 | 商品价格 |
| sales | 整数 | 累计销量 |
| comment_count | 整数 | 评论数 |
| shop_name | 字符串 | 店铺名称 |
| brand_name | 字符串 | 品牌名称 |
| category | 字符串 | 商品类目 |
| score | 浮点数 | 商品评分 |
| create_time | 日期 | 上架时间 |
数据获取上,最稳妥的方式是使用公开的电商公开数据集,或者自己写脚本生成符合字段格式的模拟数据。如果确实需要获取真实页面数据,必须先确认目标平台的用户协议、robots 规则和相关法律法规,在合法授权范围内使用。本文所有示例都以格式已知的 CSV 文件为准,不涉及任何绕过平台限制的方法。
4.2 数据清洗规则
清洗阶段主要完成这几件事:
- 去除 item_id 完全重复的商品记录。
- 过滤 price 为空、sales 为负等异常数据。
- 把价格统一转换成浮点数,把销量字符串中的“万”“+”“人付款”等干扰词去掉。
- 对 create_time 做标准化,统一为 yyyy-MM-dd 格式。
- 对评论文本做分词和去停用词,为后续情感分析做准备。
下面是一段基于 PySpark 的清洗示例:
from pyspark.sql import SparkSession from pyspark.sql.functions import col, regexp_replace, to_date spark = SparkSession.builder \ .appName("CosmeticsDataClean") \ .config("spark.sql.shuffle.partitions", "8") \ .getOrCreate() df = spark.read.format("csv") \ .option("header", "true") \ .option("encoding", "utf-8") \ .load("hdfs://localhost:9000/data/cosmetics_raw.csv") df_clean = df \ .dropDuplicates(["item_id"]) \ .filter(col("price").cast("double").isNotNull()) \ .filter(col("sales").cast("int").isNotNull()) \ .withColumn("price", col("price").cast("double")) \ .withColumn("sales", regexp_replace(col("sales"), "[万+人付款]", "").cast("int")) \ .withColumn("create_time", to_date(col("create_time"), "yyyy-MM-dd")) df_clean.show(10)这段代码可以直接在 PySpark 交互环境或脚本中运行。运行前需要确认 HDFS 上已经存在对应的原始数据文件。
5. Spark 离线分析模块设计
离线分析是整个系统的核心部分,目标是回答“化妆品商品里卖得最好的是谁、价格区间怎么分布、不同品牌之间差距有多大”这些判断性问题。
建议优先实现以下分析维度:
- 总体规模:商品总数、品牌总数、平均价格、总销量。
- 品牌维度:品牌销量 Top10、品牌平均价格、品牌商品数。
- 价格维度:价格在 0-50、50-100、100-200、200-500、500 以上区间的商品数量分布。
- 类目维度:不同类目的平均价格和销量对比。
- 时间维度:按月统计商品上架数量和销量变化趋势。
下面是一段品牌维度分析示例:
from pyspark.sql.functions import count, avg, sum, desc, round brand_result = df_clean.groupBy("brand_name") \ .agg( count("item_id").alias("item_count"), round(avg("price"), 2).alias("avg_price"), sum("sales").alias("total_sales") ) \ .orderBy(desc("total_sales")) brand_result.show(10)分析结果建议写入 MySQL,方便 Flask 后端直接查询。PySpark 写 MySQL 的标准方式是使用 JDBC:
brand_result.write.mode("overwrite") \ .format("jdbc") \ .option("url", "jdbc:mysql://localhost:3306/cosmetics?useUnicode=true&characterEncoding=utf-8") \ .option("dbtable", "brand_analysis") \ .option("user", "root") \ .option("password", "your_password") \ .save()使用 JDBC 前需要在 Spark 启动参数中加入 mysql-connector-java 依赖。如果不想处理 JDBC 依赖,也可以把结果写成 CSV 文件,再用 pandas 读取后写入 MySQL,两种方式难度差别不大。
6. 机器学习分析模块
机器学习部分不追求复杂,重点是形成一条“特征工程 + 模型训练 + 评估 + 预测”的完整链路。建议从以下三个方向中选一个到两个:
- 销量预测:用价格、评论数、评分、类目、上架时间等特征预测商品销量,适合使用线性回归、决策树或随机森林。
- 商品类目分类:用商品标题文本和价格特征预测商品所属类目,可以使用逻辑回归或朴素贝叶斯。
- 评论文本情感分析:对商品评论做正负情感分类,使用 TF-IDF + 逻辑回归即可。
下面以销量预测为例,展示 Spark MLlib 的完整流程:
from pyspark.ml.feature import VectorAssembler from pyspark.ml.regression import LinearRegression from pyspark.ml.evaluation import RegressionEvaluator model_data = df_clean.select( col("price").cast("double"), col("comment_count").cast("int"), col("score").cast("double"), col("sales").cast("int").alias("label") ) assembler = VectorAssembler( inputCols=["price", "comment_count", "score"], outputCol="features" ) model_data = assembler.transform(model_data).select("features", "label") train, test = model_data.randomSplit([0.8, 0.2], seed=42) lr = LinearRegression(featuresCol="features", labelCol="label") lr_model = lr.fit(train) pred_result = lr_model.transform(test) evaluator = RegressionEvaluator( labelCol="label", predictionCol="prediction", metricName="rmse" ) rmse = evaluator.evaluate(pred_result) print("RMSE:", rmse)这个示例的时间开销很小,几万条数据在伪分布式环境中可以很快跑完。评估指标重点看 RMSE 和 R2,论文里可以放一张真实值 vs 预测值的散点图,答辩时能直接说明模型效果。
需要注意,销量预测本身受多种因素影响,特征较少时预测精度有限。论文里应当如实分析误差来源,不要追求一个“看起来很完美”的假结果。
7. 可视化与 Web 系统搭建
Web 系统建议采用 Flask + ECharts 的轻量方案。功能页面建议包括:
- 数据总览:商品总数、品牌总数、总销量、平均价格等核心指标卡片。
- 品牌分析:品牌销量 Top10 柱状图。
- 价格分析:价格区间分布饼图或直方图。
- 销量趋势:按月销量变化折线图。
- 评论分析:正面评价 / 负面评价占比饼图。
- 销量预测:用户选择特征后,调用模型接口返回预测结果。
后端接口设计如下:
| 接口路径 | 方法 | 返回内容 |
|---|---|---|
| /api/summary | GET | 总体指标统计 |
| /api/brand_top | GET | 品牌销量 Top10 |
| /api/price_dist | GET | 价格区间分布 |
| /api/trend | GET | 月度销量趋势 |
| /api/predict | POST | 销量预测结果 |
Flask 接口示例:
from flask import Flask, jsonify, request import pymysql app = Flask(__name__) def get_conn(): return pymysql.connect( host="localhost", user="root", password="your_password", database="cosmetics", charset="utf8mb4" ) @app.route("/api/brand_top", methods=["GET"]) def brand_top(): conn = get_conn() cursor = conn.cursor() sql = "SELECT brand_name, total_sales FROM brand_analysis ORDER BY total_sales DESC LIMIT 10" cursor.execute(sql) rows = cursor.fetchall() cursor.close() conn.close() data = [{"brand": row[0], "sales": row[1]} for row in rows] return jsonify({"code": 0, "data": data}) if __name__ == "__main__": app.run(host="0.0.0.0", port=5000)前端页面使用原生 HTML + JavaScript + ECharts 即可。ECharts 的使用方式是从 CDN 引入 echarts.min.js,然后在页面中获取数据并渲染图表。这一段非常适合截图放进论文和答辩 PPT,视觉效果好,实现成本也不高。
8. 部署、验收与演示准备
建议环境配置如下:
| 项目 | 建议配置 |
|---|---|
| 操作系统 | Ubuntu 20.04 / CentOS 7 |
| 内存 | 16G 以上 |
| 磁盘 | 50G 以上 |
| JDK | 1.8 |
| Hadoop | 3.3.x |
| Spark | 3.3.x 或 3.4.x |
| Python | 3.8+ |
启动顺序很关键,一定要按照下面的顺序进行:
# 启动 HDFS hdfs namenode -format sbin/start-dfs.sh # 启动 YARN sbin/start-yarn.sh # 提交 Spark 作业 spark-submit \ --master local[*] \ --driver-memory 2g \ --executor-memory 2g \ analytics.py # 启动 Flask Web 服务 python app.py验收时需要确认的指标:
- HDFS 中能看到原始数据文件,且文件块状态为 healthy。
- Spark 作业完成后,MySQL 分析表中有对应统计结果。
- Flask 接口返回 JSON 数据正常。
- 浏览器中图表渲染正常,数字与分析结果一致。
- 多次提交 Spark 作业不会出现端口冲突或资源泄漏。
答辩演示时建议提前准备一份演示清单,包括 HDFS 目录截图、Spark 作业日志截图、MySQL 结果表截图、Web 页面截图、模型评估指标截图。这些素材能有效证明整个系统是你实际跑通的,而不是空谈理论。
9. 常见问题与排查
| 问题现象 | 可能原因 | 排查方式 | 解决方案 |
|---|---|---|---|
| Hadoop 启动失败 | NameNode 格式化异常或端口占用 | 查看 Hadoop 日志,检查 9870 端口 | 删除临时数据目录,重新格式化 |
| PySpark 连接 Spark 失败 | 环境变量未配置或服务未启动 | 检查 spark-submit 是否能运行 | 配置 SPARK_HOME,确认 HDFS/YARN 已启动 |
| Spark 作业内存溢出 | executor 内存配置过小 | 查看 YARN 日志 | 降低分区数,调大 executor 内存 |
| MySQL 连接失败 | JDBC 驱动缺失 | 检查 Spark classpath | 添加 mysql-connector-java 依赖 |
| 中文乱码 | 文件编码未设置为 UTF-8 | 检查原始文件编码 | 统一使用 UTF-8 编码写入和读取 |
| Flask 接口跨域报错 | 前端端口和后端端口不同 | 查看浏览器控制台 | 后端添加 CORS 配置 |
| 统计结果数据量过大 | 明细数据未做预聚合 | 检查接口响应时间 | 将分析结果写入 MySQL 中间表 |
| 重复格式化导致 DataNode 异常 | clusterId 不一致 | 对比 NameNode 和 DataNode 配置 | 清空所有临时目录后重新格式化 |
环境问题是大数据毕设中花费时间最多的部分,遇到报错不要盲目重装,先看日志,再动配置。
10. 工作量评估与时间规划
| 阶段 | 核心工作 | 建议时间 |
|---|---|---|
| 选题与需求 | 明确功能边界和技术路线 | 1 周 |
| 环境搭建 | Hadoop / Spark / MySQL / Flask | 1-2 周 |
| 数据准备 | 获取或生成数据,完成清洗 | 1-2 周 |
| 离线分析 | HDFS 入库,Spark SQL 分析 | 2 周 |
| 机器学习 | 特征工程、模型训练、评估 | 2 周 |
| 可视化 | Flask 接口、ECharts 页面 | 2 周 |
| 联调与论文 | 系统联调、论文撰写、答辩材料 | 2 周 |
整个项目周期大概在 11-14 周,和大多数院校的毕设周期匹配。关键原则是先把最小闭环跑通,也就是“数据进 HDFS -> Spark 出一个统计结果 -> 接口显示在页面上”,再逐步扩展模型和页面功能。如果一开始就想着把所有模块一次做完美,很容易卡在环境阶段出不来。
11. 可扩展方向与最终建议
这个项目后续可以扩展的方向不少:
- 加入 Kafka 和 Spark Streaming,做实时销量监控。
- 用 Spark ALS 推荐算法,实现化妆品商品推荐。
- 用深度学习文本分类模型替代传统情感分析。
- 引入更多维度的数据,例如用户地域、价格变动历史、促销活动信息。
但对毕设来说,最重要的不是把技术堆得有多高,而是把整条链路走通,并把每一个环节的决策理由写清楚。记住一个原则:先跑通,再优化;先小数据,再大数据;先离线,再机器学习。这套流程跑通之后,论文的核心章节基本也就有了,答辩时面对“为什么用 Spark”“数据是怎么清洗的”“模型指标怎么样”这类问题,都能拿出实际内容和日志截图来回答。