✨作者主页 :IT研究室✨
个人简介:曾从事计算机专业培训教学,擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。
☑文末获取源码☑
文章目录
一、前言
系统介绍
本系统《基于大数据的北京美食店铺数据可视化分析系统》是一个面向计算机专业毕业设计场景的大数据处理与分析平台。系统核心定位在于利用大数据技术栈解决海量城市餐饮数据的存储、计算与可视化展示问题。在技术选型上,系统采用Hadoop分布式文件系统(HDFS)作为底层数据存储底座,承担原始多源异构数据集(包括店铺基础信息、顾客点评文本、消费明细等)的持久化存储职责。计算层采用Spark计算引擎,充分利用其内存计算特性与Spark SQL模块,对存储在HDFS上的大规模数据进行高效的离线批处理与聚合分析,具体涉及数据清洗(空值剔除、异常值过滤)、数据转换(多表关联、维度编码)以及多维度统计(如区域分布统计、菜系频数统计、消费水平分箱统计、口碑评分聚合等)。后端服务层提供Spring Boot框架实现的RESTful API接口,负责接收前端请求并调用Spark计算任务,将统计分析结果以JSON数据格式返回。前端展示层基于Vue框架与ECharts可视化库,将处理后的数据通过地图散点图、饼图、柱状图、折线图等多元图表形式进行直观呈现。系统功能模块覆盖首页总览、门店信息查询、顾客点评分析、区域分布、菜系结构、消费水平、评价口碑、店铺成长趋势、评论文本挖掘以及口碑情感倾向分析,为用户提供一站式北京餐饮数据洞察解决方案。
选题背景
随着城市信息化进程的不断深化,餐饮行业作为城市生活服务业的核心组成部分,每日产生着规模庞大且增长迅速的业务数据。这些数据涵盖了店铺基本信息、消费者行为记录、交易流水、评价反馈等多个维度,具有明显的大数据特征(数据量大、结构多样、价值密度低)。然而,在实际的应用场景中,这些海量数据往往以非结构化的原始形态散落在各个外卖平台、点评网站与社交媒体中,缺乏有效的采集、整合与深度分析手段。对于计算机学科而言,如何运用成熟的大数据处理框架对特定领域的海量数据进行高效处理与价值挖掘,始终是一个兼具理论价值与实践挑战的方向。当前,许多学生在开展毕设工作时,面临的最大困惑并非缺乏数据源,而是缺少一个将完整大数据处理链路(从数据采集、清洗、计算到可视化展示)进行贯通实施的参考案例。基于上述背景,本课题以北京市餐饮行业数据为研究对象,构建一套完整的数据可视化分析系统,旨在通过实际项目实践,完整呈现大数据技术在垂直行业中的应用流程与技术细节。
选题意义
本课题的意义主要体现在实践应用层面与个人能力培养层面。从实践价值来看,北京作为超大型城市,餐饮业态丰富、分布广泛,通过该系统能够帮助普通用户或中小型餐饮从业者更直观地了解市场整体格局,例如不同城区的餐饮密度差异、菜系偏好分布、人均消费区间集中度以及口碑评价的波动规律,这些信息能够为选址决策、品类调整或经营策略优化提供一定的数据参考。从技术验证角度来看,该系统将Hadoop分布式存储与Spark内存计算进行有机结合,构建了一条从原始数据到可视化图表的完整处理流水线,这一流程的设计与实现对于后续类似规模的数据分析项目具有一定的借鉴意义。从教学与毕设指导角度出发,本课题覆盖了大数据开发中最为核心的环境搭建、数据预处理、分布式计算、接口封装以及前端可视化等多个环节,能够为后续计算机专业学生的毕设选题与项目实践提供一个结构清晰、可运行、可扩展的参考范本。最后,通过本系统的开发,笔者自身在大数据工具的协调使用、全栈开发能力以及复杂业务逻辑拆解方面也得到了切实的锻炼与提升,达到了毕业设计综合运用所学知识的目标。
二、开发环境
- 大数据框架:Hadoop+Spark(本次没用Hive,支持定制)
- 开发语言:Python+Java(两个版本都支持)
- 后端框架:Django+Spring Boot(Spring+SpringMVC+Mybatis)(两个版本都支持)
- 前端:Vue+ElementUI+Echarts+HTML+CSS+JavaScript+jQuery
- 详细技术点:Hadoop、HDFS、Spark、Spark SQL、Pandas、NumPy
- 数据库:MySQL
三、系统界面展示
- 基于大数据的北京美食店铺数据可视化分析系统界面展示:








四、代码参考
- 项目实战代码参考:
java(贴上部分代码)
@RestController
@RequestMapping("/api/food")
public class FoodDataController {
@Autowired
private SparkSession sparkSession;
@GetMapping("/regionDistribution")
public Map<String, Object> getRegionDistribution() {
Dataset<Row> df = sparkSession.read().option("header", "true").option("inferSchema", "true").csv("hdfs://localhost:9000/data/beijing_food.csv");
Dataset<Row> cleanedDf = df.na().drop("any").filter(df.col("longitude").isNotNull().and(df.col("latitude").isNotNull()));
Dataset<Row> regionDf = cleanedDf.groupBy("district").count().withColumnRenamed("count", "shopCount");
List<Row> rows = regionDf.collectAsList();
Map<String, Object> result = new HashMap<>();
List<Map<String, Object>> list = new ArrayList<>();
for (Row row : rows) {
Map<String, Object> map = new HashMap<>();
map.put("district", row.getString(0));
map.put("shopCount", row.getLong(1));
list.add(map);
}
result.put("data", list);
result.put("total", rows.size());
return result;
}
@GetMapping("/cuisineStructure")
public Map<String, Object> getCuisineStructure() {
Dataset<Row> df = sparkSession.read().option("header", "true").option("inferSchema", "true").csv("hdfs://localhost:9000/data/beijing_food.csv");
Dataset<Row> filteredDf = df.filter(df.col("cuisine").isNotNull().and(df.col("cuisine").notEqual("")));
Dataset<Row> cuisineDf = filteredDf.groupBy("cuisine").count().withColumnRenamed("count", "shopCount").orderBy(functions.desc("shopCount"));
long totalShops = cuisineDf.agg(functions.sum("shopCount")).collectAsList().get(0).getLong(0);
List<Row> rows = cuisineDf.collectAsList();
Map<String, Object> result = new HashMap<>();
List<Map<String, Object>> list = new ArrayList<>();
for (Row row : rows) {
Map<String, Object> map = new HashMap<>();
String cuisine = row.getString(0);
Long count = row.getLong(1);
double ratio = (double) count / totalShops;
map.put("cuisine", cuisine);
map.put("shopCount", count);
map.put("ratio", Math.round(ratio * 10000) / 100.0);
list.add(map);
}
result.put("data", list);
result.put("totalCuisineTypes", rows.size());
return result;
}
@GetMapping("/shopGrowthTrend")
public Map<String, Object> getShopGrowthTrend(@RequestParam String shopId) {
Dataset<Row> df = sparkSession.read().option("header", "true").option("inferSchema", "true").csv("hdfs://localhost:9000/data/beijing_food_reviews.csv");
Dataset<Row> shopDf = df.filter(df.col("shop_id").equalTo(shopId));
Dataset<Row> timeDf = shopDf.withColumn("review_date", functions.to_date(shopDf.col("review_time"))).filter(functions.year(functions.col("review_date")).equalTo(2025));
Dataset<Row> monthDf = timeDf.withColumn("month", functions.month(timeDf.col("review_date"))).groupBy("month").agg(functions.count("review_id").alias("reviewCount"), functions.avg("rating").alias("avgRating"));
List<Row> rows = monthDf.orderBy("month").collectAsList();
Map<String, Object> result = new HashMap<>();
List<Map<String, Object>> trend = new ArrayList<>();
for (Row row : rows) {
Map<String, Object> point = new HashMap<>();
point.put("month", row.getInt(0));
point.put("reviewCount", row.getLong(1));
point.put("avgRating", row.getDouble(2));
trend.add(point);
}
result.put("shopId", shopId);
result.put("trend", trend);
return result;
}
}
五、系统视频
基于大数据的北京美食店铺数据可视化分析系统项目视频:
结语
最新大数据毕业设计选题推荐-基于大数据的北京美食店铺数据可视化分析系统-大数据-Spark-Hadoop-Bigdata
想看其他类型的计算机毕业设计作品也可以和我说都有 谢谢大家!
有技术这一块问题大家可以评论区交流或者私我~
大家可以帮忙点赞、收藏、关注、评论啦~
源码获取:⬇⬇⬇