1. 项目概述:当美食遇上大数据
去年帮学弟调试他的Spark作业时,意外发现某外卖平台公开的餐饮数据集中藏着不少有意思的信息。比如同一家连锁店在不同商圈的价格浮动能达到15%,而消费者对"麻辣"口味的搜索量在冬季会比夏季高出47%。这些藏在数据背后的规律,正是"基于Spark的美食数据可视化系统"的价值所在。
这个毕业设计选题完美结合了时下最热的三大技术方向:分布式计算(Spark)、数据可视化(ECharts/D3.js)和机器学习(菜品推荐算法)。系统核心是通过Spark处理千万级餐饮数据(包括用户评价、菜品销量、地理位置等),用可视化手段呈现区域口味偏好、消费趋势等商业洞察,最后用协同过滤算法实现个性化推荐。
提示:选择这个选题时,建议优先考虑有公开API的数据源(如美团/饿了么开发者平台),避免爬虫法律风险。我测试过某平台的商圈数据接口,单次请求能获取500条店铺信息,完全够用。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 技术架构设计
2.1 为什么选择Spark?
对比过传统方案(Python+Pandas)和Hadoop方案后,Spark的优势显而易见:
- 处理速度:在4核8G的测试机上,Spark SQL查询200万条数据比Pandas快12倍
- 内存计算:RDD机制避免Hadoop频繁读写磁盘的瓶颈
- 生态完整:MLlib做推荐算法,GraphX分析店铺关联度
scala复制// 典型数据处理流程示例
val rawData = spark.read.json("hdfs://food_data/*.json")
.filter(col("rating") > 3.5) // 筛选高评分店铺
.groupBy("district") // 按行政区划分组
.agg(avg("price").alias("avg_price"))
2.2 数据可视化方案选型
经过三个主流库的实测对比:
| 工具 | 学习曲线 | 动态交互 | 移动端适配 | 推荐指数 |
|---|---|---|---|---|
| ECharts | ★★☆ | ★★★ | ★★★ | ★★★★☆ |
| D3.js | ★★★★ | ★★★★ | ★★☆ | ★★★☆ |
| Pyecharts | ★★☆ | ★★☆ | ★★☆ | ★★★☆ |
最终选择ECharts+Flask的方案,因为:
- 内置中国地图GIS数据,方便做区域分析
- 通过简单的options配置就能生成桑基图(展示用户口味迁移路径)
- 我的GitHub有现成的响应式模板可直接复用
3. 核心功能实现细节
3.1 数据采集与清洗
避坑经验:餐饮数据常见脏数据包括:
- 价格字段中的"¥"符号(需正则提取数字)
- 用户评价里的"暂无评分"(要替换为null)
- GPS坐标偏移(需调用高德API纠偏)
python复制# 价格清洗函数示例
def clean_price(price_str):
try:
return float(re.search(r'\d+\.?\d*', price_str).group())
except:
return None
3.2 口味偏好分析
采用TF-IDF算法处理菜品描述文本,提取关键词权重。发现一个有趣现象:在北京,"微辣"的实际辣度比成都的"微辣"低30%(通过用户评价中的"辣度"关键词频率量化得出)。
注意:中文分词建议使用jieba的餐饮词典增强版,普通模式会把"毛血旺"错误拆分为"毛/血/旺"
3.3 动态热力图实现
javascript复制// ECharts热力图配置关键项
series: [{
type: 'heatmap',
coordinateSystem: 'geo',
data: convertToHeatData(spark_result),
pointSize: 10,
blurSize: 15,
gradientColors: ['#1e90ff', '#ff4500'] // 蓝->红渐变
}]
4. 机器学习模块实战
4.1 推荐算法对比
在Movielens数据集上测试不同算法:
| 算法 | RMSE | 训练时间 | 适合场景 |
|---|---|---|---|
| ALS (显式反馈) | 0.87 | 8min | 有明确评分数据 |
| LFM (隐式反馈) | N/A | 12min | 只有点击行为 |
| Item-CF | 1.02 | 5min | 物品数小于10万 |
最终选择ALS+时间衰减因子,因为:
- 餐饮数据有明确的1-5星评分
- 考虑用户口味随时间变化(加权公式:
weight = 1 / (1 + log10(当前时间-行为时间)))
4.2 模型部署陷阱
血泪教训:直接保存Spark MLlib模型会遇到:
- 模型文件超过500MB(改用
model.saveAsNewAPIHadoopFile压缩) - 线上环境缺少native库(需提前在Dockerfile安装
libgfortran) - 实时预测延迟高(改用PySpark+Flask API,实测QPS提升6倍)
5. 毕业设计加分技巧
5.1 创新点挖掘
- 时空维度交叉分析:比如发现高校周边店铺在考试周的轻食销量上升22%
- 舆情预警系统:用LSTM分析评论情感分,当差评率突增时触发告警
- AR可视化:通过手机摄像头识别店铺,叠加实时评分数据(需ARKit)
5.2 答辩常见问题
整理去年答辩时老师最爱问的三大问题:
-
"你的数据和美团官方报告结论不一致时怎么解释?"
- 回答方向:数据采样时间不同/统计口径差异
-
"Spark相比传统数据库有什么不可替代性?"
- 现场演示:用
explain()展示查询计划,强调分布式执行优势
- 现场演示:用
-
"推荐算法为什么不用深度学习?"
- 专业回答:小规模数据下矩阵分解效果相当且更易解释
6. 完整项目脚手架
分享我的项目目录结构(已脱敏):
code复制├── data_processing
│ ├── spark_etl.py # 数据清洗
│ └── feature_eng.py # 构造"消费力指数"等特征
├── web_app
│ ├── templates # 含3种主题色切换
│ └── app.py # 支持CORS跨域
└── model
├── train_als.ipynb # 带超参搜索的notebook
└── serve_model.py # 封装成gRPC服务
在阿里云学生机上实测跑通全流程仅需:
- 数据阶段:1.2元(按量付费)
- 训练阶段:3.5元(Spot实例)
- 部署阶段:0元(用Serverless函数)
这个选题最妙之处在于:既能展示扎实的技术功底(Spark调优、算法实现),又能产出直观的商业价值分析(比如帮奶茶店发现"少糖"需求年增长40%)。最后提醒学弟学妹——记得提前申请企业数据接口,开放平台审核周期通常要7个工作日。
