基于Hadoop与Spark的淘宝化妆品数据分析系统设计与实现

基于Hadoop与Spark的淘宝化妆品数据分析系统设计与实现 做一个大数据方向的毕设最难的不是写代码而是“选什么题、做到什么程度、用什么技术栈”。如果你已经学过 Python、Spark、Hadoop却不知道该做什么项目那么“淘宝化妆品数据分析系统”是一个很值得考虑的选题方向。它不是纯理论堆砌也不是简单 CRUD而是把大数据存储、分布式计算、数据清洗、可视化和机器学习串联起来的一套完整闭环。这篇文章我会站在“毕设选题”和“工程落地”两个角度拆解这个系统的设计思路、核心模块、环境搭建过程、关键代码实现以及高频排错点。读完你可以直接照着搭出一套可运行、可答辩、有技术亮点的数据分析系统而不是只交一个“爬虫 图表”的浅层 demo。1. 大数据毕设选题为什么我推荐做“电商数据分析”先给一个明确判断大部分大数据方向的毕业设计档次差距不是体现在用了多少框架而是体现在“数据链路是否完整、分析是否有业务含义、结果是否能验证”。常见三类选题的对比选题类型典型做法常见问题技术含金量爬虫 展示爬取商品数据存 MySQL前端展示数据量小框架只是装饰低算法模型 调参拿公开数据集训练一个模型与大数据技术脱节难以体现分布式能力中大数据分析平台Hadoop 存储 Spark 计算 可视化 模型链路完整可扩展可答辩高“淘宝化妆品数据分析系统”属于第三种。它有一个非常自然的业务场景从商品数据中分析销量趋势、价格分布、品牌竞争、用户评论情感甚至预测未来销量。这些分析结果可以指导“选品”“定价”“库存管理”是有业务价值的。更重要的是它天然适合使用分布式技术。化妆品数据量大、字段多、评论文本长单机 Pandas 处理会吃力放在 HDFS 上用 Spark 做离线批处理再配合 Spark MLlib 做简单的机器学习任务技术栈非常正。2. 系统总体架构与技术选型这套系统的整体架构可以概括为数据接入 - 分布式存储 - 数据清洗与计算 - 机器学习建模 - 可视化展示。2.1 分层架构层级组件职责数据源层淘宝商品页 / 模拟数据获取原始商品、销量、评论数据采集层Python Requests / Scrapy数据抓取或者生成模拟数据存储层Hadoop HDFS / MySQL原始数据、结构化结果存储计算层Spark SQL / Spark MLlib离线清洗、聚合分析、特征计算服务层Flask / FastAPI提供 REST API 给前端调用展示层Vue / ECharts图表展示、结果查询2.2 技术选型说明这里强调一点毕设项目不一定追求“最新版本”而是要“稳定、资料多、你讲得清楚”。Hadoop采用稳定版 2.x 或 3.x 都可以。如果只在一台机器上验证建议先跑伪分布式再把数据量扩大体会真正的分布式优势。Spark使用 Spark 2.4 或 Spark 3.x重点是 Spark SQL、DataFrame 和 MLlib。不要一开始就纠结 RDD 底层原理先用 DataFrame 把业务跑通。Python3.8 均可主要写数据处理脚本、Web 后端和可视化接口。数据库MySQL 用于存储最终统计结果和用户信息HDFS 用于存储原始日志和中间结果。可视化ECharts 是最稳妥的选择图表丰富、中文资料多配合 Flask/FastAPI 返回 JSON 即可。2.3 为什么用 Hadoop Spark而不是只写 Pandas一个合格的毕设除了“能跑”还要能回答“为什么这么设计”。化妆品商品数据不是一个小 CSV而是一批需要存储在分布式文件系统里的海量日志。Hadoop HDFS 负责可靠存储和扩展Spark 负责内存计算比 MapReduce 快很多Spark SQL 让代码不需要写大量 Java 逻辑而是用类似 SQL 的方式做聚合Spark MLlib 直接提供线性回归、随机森林、K-Means、TF-IDF 等算法非常适合做销量预测和评论情感分析。如果你只用 Pandas 处理 100 万条数据内存很容易不够而且体现不了 Hadoop 生态的价值。反过来如果只搭集群不做分析又显得“为分布式而分布式”。把两者结合就是毕设答辩时的完整故事线。3. 环境准备与集群搭建这部分是整个系统最容易打击人的地方。很多人不是不会写分析代码而是 Hadoop 起不来、端口被占用、Spark 找不到 Python 环境最后连 Hello World 都没跑通。下面给出最低成本的验证环境方案适合在学校机房或个人电脑上复现。3.1 基础环境清单软件用途建议版本Linux / macOS / Windows WSL操作系统建议 Linux 或 WSL2JDKHadoop 依赖JDK 8 或 11HadoopHDFS / YARN2.10.x 或 3.3.xSpark分布式计算2.4.x 或 3.3.xPython脚本与算法3.8 ~ 3.10MySQL统计结果存储5.7 / 8.0Flask / FastAPIWeb 后端最新稳定版即可注意Spark 3.x 使用 SparkSession不再需要手动创建 SparkContextSpark 2.4 还兼容旧的spark-submit方式。具体版本请以官方文档为准这里不写死某个版本号重点是让读者理解环境之间如何协同。3.2 Hadoop 伪分布式搭建要点如果只做毕设验证单机伪分布式就够了。核心配置是三个 XML 文件core-site.xmlconfiguration property namefs.defaultFS/name valuehdfs://localhost:9000/value /property /configurationhdfs-site.xmlconfiguration property namedfs.replication/name value1/value /property property namedfs.namenode.name.dir/name value/home/hadoop/data/namenode/value /property property namedfs.datanode.data.dir/name value/home/hadoop/data/datanode/value /property /configurationmapred-site.xmlconfiguration property namemapreduce.framework.name/name valueyarn/value /property /configurationyarn-site.xmlconfiguration property nameyarn.nodemanager.aux-services/name valuemapreduce_shuffle/value /property /configuration启动前一定要先格式化 HDFShdfs namenode -format启动后的验证命令jps正常你会看到NameNode、DataNode、ResourceManager、NodeManager等进程。如果看不到优先去logs目录看异常日志。3.3 Spark 与 Python 环境对接Spark 通过spark-submit提交 Python 脚本时会调用PYSPARK_PYTHON指定 Python 解释器。很多人的pyspark能启动但执行collect()时爆 Java 空指针就是因为 Python 环境没有配好。在你的~/.bashrc或~/.zshrc中追加export SPARK_HOME/your/path/spark export PATH$PATH:$SPARK_HOME/bin:$SPARK_HOME/sbin export PYTHONPATH$SPARK_HOME/python:$PYTHONPATH export PYSPARK_PYTHON/usr/local/bin/python3 export PYSPARK_DRIVER_PYTHON/usr/local/bin/python3配置完成后终端执行spark-submit --version pyspark能进入 PySpark shell 并看到 SparkSession 提示说明基础环境已经通了。4. 数据获取与模拟数据生成淘宝页面结构经常变动直接爬取很可能被反爬限制也无法保证“合法采集”。从合规角度和安全角度考虑毕设推荐的做法是先写一个数据生成器按照真实字段结构生成模拟数据再接入 HDFS。如果你确实需要真实公开数据请使用官方开放 API 或已授权的数据集并去除个人敏感信息。4.1 数据字段设计设计一个商品快照表和一个评论表模拟一天内采集到的数据。商品快照表字段如下字段名类型说明item_idstring商品 IDitem_namestring商品名称brandstring品牌categorystring类目如“面部护肤”pricefloat当前价格sales_volumeint月销量comment_countint评论数shop_namestring店铺名称provincestring发货地省份collect_datestring采集日期评论表字段字段名类型说明comment_idstring评论 IDitem_idstring商品 IDuser_ratingint评分 1-5comment_contentstring评论内容comment_datestring评论日期4.2 用 Python 生成模拟数据这里给出一个可运行的生成脚本它会生成 5000 条商品数据和 50000 条评论数据输出为 CSV 文件。# 文件路径data_generator/gen_data.py import csv import random import datetime brands [韩束, 百雀羚, 自然堂, 欧莱雅, 完美日记, 花西子, 兰蔻, 雅诗兰黛] categories [面部护肤, 彩妆, 身体护理, 香水, 美妆工具] provinces [广东, 上海, 浙江, 江苏, 北京, 四川, 湖北] shops [官方旗舰店, 全球购, 美妆专营店, 海外专营店, 品牌直营店] positive_words [好用, 保湿, 效果不错, 送货快, 性价比高, 回购, 温和, 清爽] negative_words [失望, 油腻, 过敏, 味道难闻, 包装破损, 假货, 没有效果] def gen_item(item_id, date_str): name random.choice(brands) random.choice([精华液, 面膜, 洗面奶, 口红, 香水, 乳液]) return [ item_id, name, random.choice(brands), random.choice(categories), round(random.uniform(19.9, 599), 2), random.randint(10, 50000), random.randint(5, 5000), random.choice(shops), random.choice(provinces), date_str ] def gen_comment(comment_id, item_id, date_str): if random.random() 0.7: content random.choice(positive_words) else: content random.choice(negative_words) return [ comment_id, item_id, random.randint(1, 5), content, date_str ] def main(): today datetime.date.today().strftime(%Y-%m-%d) with open(items.csv, w, newline, encodingutf-8) as f1: writer csv.writer(f1) writer.writerow([item_id, item_name, brand, category, price, sales_volume, comment_count, shop_name, province, collect_date]) for i in range(1, 5001): writer.writerow(gen_item(fITEM{i:06d}, today)) with open(comments.csv, w, newline, encodingutf-8) as f2: writer csv.writer(f2) writer.writerow([comment_id, item_id, user_rating, comment_content, comment_date]) for i in range(1, 50001): # 随机绑定到某个商品 item_id fITEM{random.randint(1, 5000):06d} writer.writerow(gen_comment(fCMT{i:08d}, item_id, today)) if __name__ __main__: main()这段代码演示了如何生成结构化的模拟数据。你可以在答辩时说明真实场景中这段逻辑会被替换为采集脚本但为了稳定的实验环境先用模拟数据跑通整条流水线。4.3 上传数据到 HDFS启动 Hadoop 后创建目录并上传数据hdfs dfs -mkdir -p /user/hadoop/taobao_cosmetics/raw/items hdfs dfs -mkdir -p /user/hadoop/taobao_cosmetics/raw/comments hdfs dfs -put items.csv /user/hadoop/taobao_cosmetics/raw/items/ hdfs dfs -put comments.csv /user/hadoop/taobao_cosmetics/raw/comments/验证上传hdfs dfs -ls /user/hadoop/taobao_cosmetics/raw/items/看到文件列表之后就说明 HDFS 已经存好了原始数据Spark 可以开始读取了。5. Spark 核心分析代码实现这部分是整个毕设的“技术发动机”。我们要用 Spark SQL 完成三件事数据清洗、统计分析、结果落库。5.1 数据清洗与 ETL原始数据往往包含空值、重复值和异常价格。下面代码读取 CSV 后过滤掉空值和价格小于等于 0 的记录并计算“销售额”字段。# 文件路径spark_jobs/etl_process.py from pyspark.sql import SparkSession from pyspark.sql.functions import col, when, round as spark_round spark SparkSession.builder \ .appName(TaobaoCosmeticsETL) \ .getOrCreate() # 读取 HDFS 上的商品数据 df_items spark.read \ .option(header, true) \ .option(inferSchema, true) \ .csv(hdfs://localhost:9000/user/hadoop/taobao_cosmetics/raw/items/) # 读取评论数据 df_comments spark.read \ .option(header, true) \ .option(inferSchema, true) \ .csv(hdfs://localhost:9000/user/hadoop/taobao_cosmetics/raw/comments/) # 清洗商品表去重、过滤无效价格和销量 df_items_clean df_items.dropDuplicates([item_id]) \ .filter(col(price).isNotNull() (col(price) 0)) \ .filter(col(sales_volume).isNotNull() (col(sales_volume) 0)) \ .withColumn(gmv, spark_round(col(price) * col(sales_volume), 2)) # 清洗评论表去重、过滤评分不在 1-5 区间的记录 df_comments_clean df_comments.dropDuplicates([comment_id]) \ .filter(col(user_rating).between(1, 5)) # 保存中间结果 df_items_clean.write.mode(overwrite).parquet( hdfs://localhost:9000/user/hadoop/taobao_cosmetics/clean/items ) df_comments_clean.write.mode(overwrite).parquet( hdfs://localhost:9000/user/hadoop/taobao_cosmetics/clean/comments ) print(ETL finished!) spark.stop()这里有一个关键点把清洗结果写成 Parquet而不是继续用 CSV。原因是 Parquet 是列式存储后续 Spark 读取性能更好同时字段类型也能保留不会像 CSV 那样每次都要重新推断类型。5.2 统计分析品牌销售额排行、价格分布、评论评分清洗完成后使用 Spark SQL 做多维度聚合分析。# 文件路径spark_jobs/analysis.py from pyspark.sql import SparkSession from pyspark.sql.functions import count, avg, sum as sql_sum spark SparkSession.builder \ .appName(TaobaoCosmeticsAnalysis) \ .getOrCreate() df_items spark.read.parquet( hdfs://localhost:9000/user/hadoop/taobao_cosmetics/clean/items ) df_comments spark.read.parquet( hdfs://localhost:9000/user/hadoop/taobao_cosmetics/clean/comments ) # 创建临时视图方便写 SQL df_items.createOrReplaceTempView(items) df_comments.createOrReplaceTempView(comments) # 品牌销售额 TopN result_brand_gmv spark.sql( SELECT brand, COUNT(*) AS product_cnt, ROUND(SUM(gmv), 2) AS total_gmv FROM items GROUP BY brand ORDER BY total_gmv DESC ) result_brand_gmv.show(10) # 价格区间分布 result_price_dist spark.sql( SELECT CASE WHEN price 50 THEN 0-50 WHEN price 100 THEN 50-100 WHEN price 200 THEN 100-200 ELSE 200 END AS price_level, COUNT(*) AS cnt FROM items GROUP BY price_level ORDER BY price_level ) result_price_dist.show() # 商品评分均值和评论数 result_rating spark.sql( SELECT i.item_id, i.item_name, ROUND(AVG(c.user_rating), 2) AS avg_rating, COUNT(c.comment_id) AS comment_cnt FROM items i LEFT JOIN comments c ON i.item_id c.item_id GROUP BY i.item_id, i.item_name ORDER BY comment_cnt DESC LIMIT 20 ) result_rating.show() # 写入 MySQL需要提前创建目标表 result_brand_gmv.write \ .mode(overwrite) \ .format(jdbc) \ .option(url, jdbc:mysql://localhost:3306/taobao_cosmetics?useSSLfalseserverTimezoneAsia/Shanghai) \ .option(dbtable, brand_gmv_result) \ .option(user, root) \ .option(password, your_password) \ .option(driver, com.mysql.cj.jdbc.Driver) \ .save() spark.stop()写入 MySQL 之前要在 MySQL 中手动建表表字段要和 DataFrame 列保持一致。否则 Spark 会因为表不存在或字段类型不匹配报错。5.3 评论情感分析与销量预测机器学习的部分有两种难度选择。简单路线对评论内容使用分词和词频统计计算积极/消极词占比得到“好评率”。进阶路线用 TF-IDF 提取文本特征训练逻辑回归或朴素贝叶斯分类器预测评论情感为正面还是负面。同时用历史销量数据训练线性回归模型预测未来销量。下面给出一个基于 Spark MLlib 的销量预测示例采用线性回归。实际毕设中你可以选择时间序列模型但线性回归更容易解释也更容易调通。# 文件路径spark_jobs/sales_predict.py from pyspark.sql import SparkSession from pyspark.ml.feature import VectorAssembler from pyspark.ml.regression import LinearRegression from pyspark.ml.evaluation import RegressionEvaluator spark SparkSession.builder \ .appName(SalesForecast) \ .getOrCreate() # 读取清洗后的数据演示时只取商品价格、评论数、评分等数值特征 df spark.read.parquet( hdfs://localhost:9000/user/hadoop/taobao_cosmetics/clean/items ).select(price, comment_count, sales_volume).dropna() # 这里为了教学用 sales_volume 作为预测目标 feature_cols [price, comment_count] assembler VectorAssembler(inputColsfeature_cols, outputColfeatures) data assembler.transform(df).select(features, sales_volume) # 按 8:2 划分训练集和测试集 train_data, test_data data.randomSplit([0.8, 0.2], seed42) lr LinearRegression(featuresColfeatures, labelColsales_volume) model lr.fit(train_data) test_result model.transform(test_data) evaluator RegressionEvaluator(labelColsales_volume, predictionColprediction, metricNamermse) rmse evaluator.evaluate(test_result) print(fRoot Mean Squared Error: {rmse}) print(fModel Coefficients: {model.coefficients}) print(fModel Intercept: {model.intercept}) model.write().overwrite().save( hdfs://localhost:9000/user/hadoop/taobao_cosmetics/models/sales_lr ) spark.stop()这是一个非常容易跑通的示例。实际项目中你还需要做特征工程、数据归一化、交叉验证但作为毕设先跑通这一步就可以在论文里写“基于 Spark MLlib 的销量预测模型”了。6. Web 系统与可视化展示分析结果要能展示否则项目缺少“产品感”。这里用 Flask 做一个轻量后端把 MySQL 中的结果通过 JSON 接口返回前端用 ECharts 绘制图表。6.1 Flask 后端接口# 文件路径web_backend/app.py from flask import Flask, jsonify import pymysql app Flask(__name__) def get_db_conn(): return pymysql.connect( hostlocalhost, userroot, passwordyour_password, databasetaobao_cosmetics, charsetutf8mb4, cursorclasspymysql.cursors.DictCursor ) app.route(/api/brand_gmv) def brand_gmv(): conn get_db_conn() with conn.cursor() as cursor: cursor.execute(SELECT brand, total_gmv FROM brand_gmv_result ORDER BY total_gmv DESC LIMIT 10) rows cursor.fetchall() conn.close() return jsonify(rows) app.route(/api/price_dist) def price_dist(): conn get_db_conn() with conn.cursor() as cursor: cursor.execute(SELECT price_level, cnt FROM price_dist_result ORDER BY price_level) rows cursor.fetchall() conn.close() return jsonify(rows) app.route(/api/rating_top) def rating_top(): conn get_db_conn() with conn.cursor() as cursor: cursor.execute(SELECT item_name, avg_rating, comment_cnt FROM rating_top_result ORDER BY comment_cnt DESC LIMIT 20) rows cursor.fetchall() conn.close() return jsonify(rows) if __name__ __main__: app.run(host0.0.0.0, port5000, debugTrue)6.2 前端 ECharts 展示前端可以使用 Vue 静态页面也可以直接写一个 HTML ECharts 页面。这里给出一个简单的 HTML 骨架用于展示品牌销售额柱状图和价格区间饼图。!DOCTYPE html html langzh-CN head meta charsetUTF-8 title淘宝化妆品数据分析系统/title script srchttps://cdn.jsdelivr.net/npm/echarts5/dist/echarts.min.js/script /head body div idbrandChart stylewidth: 600px; height: 400px;/div div idpriceChart stylewidth: 600px; height: 400px;/div script async function initCharts() { const brandRes await fetch(/api/brand_gmv); const brandData await brandRes.json(); const brandChart echarts.init(document.getElementById(brandChart)); brandChart.setOption({ title: { text: 品牌销售额 Top10 }, tooltip: {}, xAxis: { data: brandData.map(item item.brand) }, yAxis: {}, series: [{ type: bar, data: brandData.map(item item.total_gmv) }] }); const priceRes await fetch(/api/price_dist); const priceData await priceRes.json(); const priceChart echarts.init(document.getElementById(priceChart)); priceChart.setOption({ title: { text: 价格区间分布 }, tooltip: {}, series: [{ type: pie, data: priceData.map(item ({ name: item.price_level, value: item.cnt })) }] }); } initCharts(); /script /body /html这样整套系统就有了一个完整的前后端闭环Spark 分析结果落 MySQL - Flask 提供接口 - ECharts 渲染图表。7. 运行验证与效果评估很多同学在答辩前最担心的问题就是“怎么证明我的系统是有效的”。建议从三个角度验证。7.1 数据量验证在 HDFS 上查看原始数据量和清洗后的数据量hdfs dfs -du -h /user/hadoop/taobao_cosmetics/raw/ hdfs dfs -du -h /user/hadoop/taobao_cosmetics/clean/数据量明显增加说明分布式存储生效清洗后的 Parquet 大小小于原始 CSV说明列式存储的压缩优势体现出来了。7.2 分析结果验证运行spark-submit提交分析任务spark-submit \ --master local[2] \ --driver-memory 2g \ --executor-memory 2g \ spark_jobs/analysis.py看到 Spark SQL 输出的结果表brand_gmv、price_dist、rating_top后再去 MySQL 查询对应表确认结果已经写入。SELECT * FROM brand_gmv_result ORDER BY total_gmv DESC LIMIT 10;如果 MySQL 有数据且前端接口能返回说明整条链路已经打通。7.3 模型效果验证对于销量预测模型重点看 RMSE均方根误差。RMSE 越小说明模型预测越准确。如果你发现 RMSE 很大不要慌这很正常。你可以进一步做特征分析比如加入“品牌知名度”“促销折扣”等特征或者使用随机森林回归。答辩时对比不同模型的 RMSE本身就是很好的技术内容。8. 常见问题与排查思路8.1 Hadoop 启动失败NameNode 起不来问题现象可能原因排查方式解决方案jps没有 NameNode未格式化或格式化信息不一致查看logs/hadoop-*.log备份数据后重新执行hdfs namenode -formatDataNode 无法启动dfs.datanode.data.dir目录无权限检查目录权限使用chown或chmod修改权限集群端口占用9000 / 9870 被其他进程占用netstat -tlnp | grep 9000修改core-site.xml端口或关闭占用进程这里的经典坑是多次格式化 NameNode 后DataNode 和 NameNode 的 clusterID 不一致导致 DataNode 启动失败。解决方式是停止集群删除 data 目录重新格式化。8.2 Spark 提交任务失败Python 环境找不到问题现象可能原因排查方式解决方案pyspark里能运行spark-submit报python not foundPYSPARK_PYTHON未设置或指向错误在spark-env.sh中打印环境变量设置export PYSPARK_PYTHON/usr/bin/python3执行collect()报空指针Python 解释器和 Spark 版本不匹配检查 PySpark 包版本pip install pyspark对应spark版本中文乱码Linux 环境语言编码问题检查locale设置LANGzh_CN.UTF-88.3 Spark on YARN 只用了 1 个 CPU这个问题在搜索热词中出现过也确实是实际项目里很容易踩到的坑。表面现象是每个 Executor 只有一个 vCore集群资源利用率低。常见原因和解决思路可能原因排查方式解决方案提交时未指定--num-executors、--executor-cores查看提交命令在spark-submit中显式配置资源YARNyarn.nodemanager.resource.cpu-vcores配置过低查看 NodeManager 日志和 YARN 配置调整yarn-site.xml中 vCore 数量Spark 动态资源分配未关闭查看 Spark UI 日志设置spark.dynamicAllocation.enabledfalse例如本地机验证时可以指定spark-submit \ --master yarn \ --deploy-mode client \ --num-executors 2 \ --executor-cores 2 \ --executor-memory 2g \ spark_jobs/analysis.py但要注意如果集群节点实际 CPU 核数不足强行指定 2 个 Executor 各 2 核任务可能会排队等待资源。这里要理解 YARN 调度的原理而不是盲目调大数字。8.4 MySQL 数据写入失败问题现象可能原因排查方式解决方案Access denied for user用户密码错误用命令行测试连接修改代码中的连接参数Table doesnt exist未手动建表查看 MySQL 数据库表列表提前执行CREATE TABLE时区报错MySQL JDBC 驱动连接参数缺少 serverTimezone查看报错信息URL 中增加serverTimezoneAsia/Shanghai写 MySQL 时建议使用mode(overwrite)方便重复测试。9. 最佳实践与答辩建议9.1 项目结构要清晰一个清晰的项目结构会让答辩老师一眼看出你的工程能力。taobao-cosmetics-system/ ├── data_generator/ # 模拟数据生成脚本 ├── spark_jobs/ # Spark 分析任务 │ ├── etl_process.py │ ├── analysis.py │ └── sales_predict.py ├── web_backend/ # Flask 后端 │ └── app.py ├── web_frontend/ # 可视化页面 │ └── index.html ├── docs/ # 论文、设计文档、PPT └── README.md # 项目说明和环境部署文档9.2 代码要能重复运行数据分析系统最怕“只能跑一次”。在你的部署文档里要把启动顺序写清楚先启动 Hadoop再运行数据生成脚本再上传 HDFS再提交 Spark 任务最后启动 Flask。建议写一个run-all.sh脚本自动化这个过程但这部分要结合你的实际路径。9.3 数据安全与合规提醒不要直接抓取淘宝、京东等电商平台的真实用户数据用于毕设展示尤其是含手机号、地址、真实用户名等敏感字段。推荐使用脱敏后的公开数据集或自行构造的模拟数据。这一点不仅是安全底线也是答辩加分项——说明你具备数据合规意识。9.4 答辩讲故事的顺序答辩时不要一上来讲安装细节而是按这个顺序讲背景电商行业需要了解用户消费行为和商品销售趋势。问题单机处理不了海量商品和评论数据。方案Hadoop 存数据Spark 做分析和建模Web 展示结果。验证数据规模、分析结果、模型指标。创新点数据流水线完整不只停留在爬虫或模型。9.5 后续可扩展方向这套系统可以继续扩展的方向很多接入实时数据使用 Spark Streaming / Flink 做实时销量统计。增加协同过滤推荐实现“相似化妆品推荐”。使用深度学习模型如 TextCNN、BERT做更精细的评论情感分析。补充用户画像模块分析不同地域、不同价格偏好的用户群体。但要注意不要贪多。毕设答辩看重的是“你能把一条链路讲清楚”。建议先把基础链路跑通再根据情况选择一到两个扩展点。10. 总结“Python Spark Hadoop 淘宝化妆品数据分析系统”是一个非常适合大数据方向毕设的题目。它的技术栈覆盖了 Hadoop HDFS、Spark SQL、Spark MLlib、Python Web 和 ECharts既有存储又有计算既有离线分析又有机器学习自然过渡到论文的不同章节。这篇文章给出了从数据生成、集群搭建、ETL、统计分析、模型训练到可视化展示的完整实现思路和核心代码。你不需要一上来就搭建三台服务器先在单机伪分布式环境下跑通整条链路理解每一个模块的作用再把任务提交到 YARN 上就能在答辩中站稳脚跟。下一步建议是先按照文中的代码把数据生成、ETL、分析三个脚本运行起来再看 MySQL 里有没有结果。只要这条主线通了后面再做前端、做模型、做扩展都会顺畅很多。建议收藏备用搭建过程中遇到具体报错按文中的排查表格逐项定位即可。