一、个人简介
💖💖作者:计算机编程果茶熊 💙💙个人简介:曾长期从事计算机专业培训教学,担任过编程老师,同时本人也热爱上课教学,擅长Java、微信小程序、Python、Golang、安卓Android等多个IT方向。会做一些项目定制化开发、代码讲解、答辩教学、文档编写、也懂一些降重方面的技巧。平常喜欢分享一些自己开发中遇到的问题的解决办法,也喜欢交流技术,大家有技术代码这一块的问题可以问我! 💛💛想说的话:感谢大家的关注与支持! 💜💜 网站实战项目 安卓/小程序实战项目 大数据实战项目 计算机毕业设计选题 💕💕文末获取源码联系计算机编程果茶熊
二、系统介绍
大数据框架:Hadoop+Spark(Hive需要定制修改) 开发语言:Java+Python(两个版本都支持) 数据库:MySQL 后端框架:SpringBoot(Spring+SpringMVC+Mybatis)+Django(两个版本都支持) 前端:Vue+Echarts+HTML+CSS+JavaScript+jQuery
《上海餐饮数据分析与可视化系统》是一个集数据处理、深度分析与前端可视化于一体的综合性解决方案,旨在对上海地区庞大的餐饮行业数据进行多维度、系统性的洞察。本系统的技术架构以后端强劲的数据处理能力与前端丰富的交互体验为核心,底层采用Hadoop分布式文件系统(HDFS)作为海量数据的存储基石,确保数据的可靠性与高吞吐量;计算层则引入了高性能的内存计算框架Spark,利用其核心组件Spark SQL对存储于HDFS的餐饮数据进行快速的查询、聚合与复杂分析,并通过Pandas与NumPy库进行精细化的数据清洗与结构化处理,为上层分析提供高质量的数据源。系统的后端服务基于成熟稳定的Python Django框架构建,负责实现全部业务逻辑、管理API接口以及调度Spark分析任务,同时使用MySQL数据库存储用户信息、系统配置等关键结构化数据。前端界面则采用现代化的Vue框架,并结合ElementUI组件库与Echarts图表库,为用户打造了一个响应式、操作直观且数据呈现清晰的交互平台。系统功能全面覆盖了从基础的数据管理到高级的智能分析,包括用户权限控制、上海餐饮原始数据的增删改查、揭示行业整体态势的“市场宏观分析”、评估商家口碑与服务水平的“质量口碑分析”、洞察食客消费偏好的“消费行为分析”、展现餐饮资源空间分布特征的“地理空间分析”、以及实现精准营销的“客群细分分析”等核心模块。所有分析结果最终汇集于一个动态、酷炫的“可视化大屏”中,将复杂的数据以图表、地图、指标卡等多种形式直观呈现,帮助用户快速掌握上海餐饮市场的脉搏,为餐饮从业者、市场分析师及投资者提供有力的数据支持。
三、视频解说
四、部分功能展示
五、部分代码展示
from pyspark.sql import SparkSession
from pyspark.sql.functions import col, avg, count, sum as spark_sum
from django.http import JsonResponse
import json
# ① 初始化SparkSession,这是与Spark交互的入口点
# 在实际Django项目中,这个session通常是全局初始化一次,而不是在每个请求中都创建
spark = SparkSession.builder \
.appName("ShanghaiCateringAnalysis") \
.master("local[*]") \
.config("spark.some.config.option", "some-value") \
.getOrCreate()
# 假设数据已存储在HDFS上
HDFS_DATA_PATH = "hdfs://namenode:9000/shanghai_catering/data.csv"
def market_macro_analysis(request):
"""
核心功能一:市场宏观分析
业务逻辑:从HDFS读取全量餐饮数据,使用Spark SQL进行聚合统计。
计算不同餐饮类别(如本帮菜、日料、火锅等)的数量,并按数量降序排列,
最终返回各类别的统计结果,用于前端生成市场份额饼图或柱状图。
"""
try:
df = spark.read.option("header", "true").option("inferSchema", "true").csv(HDFS_DATA_PATH)
df.createOrReplaceTempView("restaurants")
# 编写Spark SQL查询语句,按'category'字段分组并计数
query = """
SELECT category, COUNT(1) as count
FROM restaurants
WHERE category IS NOT NULL
GROUP BY category
ORDER BY count DESC
LIMIT 15
"""
result_df = spark.sql(query)
# 将Spark DataFrame的结果转换为JSON格式
# .collect()会将分布式数据拉取到Driver节点,对于大数据集需谨慎
results = result_df.toJSON().map(lambda j: json.loads(j)).collect()
return JsonResponse({'code': 200, 'data': results, 'message': 'success'})
except Exception as e:
return JsonResponse({'code': 500, 'message': str(e)})
def quality_reputation_analysis(request):
"""
核心功能二:质量口碑分析
业务逻辑:分析不同人均消费区间('price_range')的餐厅其平均评分、总评论数等指标。
这有助于揭示高端、中端、低端市场的口碑差异。
使用Spark DataFrame API进行链式操作,实现更复杂的聚合计算。
"""
try:
df = spark.read.option("header", "true").option("inferSchema", "true").csv(HDFS_DATA_PATH)
# 数据类型转换,确保后续计算的准确性
df = df.withColumn("rating", col("rating").cast("float")) \
.withColumn("review_count", col("review_count").cast("int"))
# 按'price_range'分组,并计算多项聚合指标
# 使用.agg()可以同时计算多个聚合函数
result_df = df.groupBy("price_range") \
.agg(
avg("rating").alias("avg_rating"),
count("*").alias("restaurant_count"),
spark_sum("review_count").alias("total_reviews")
) \
.orderBy("price_range")
# 对结果进行格式化处理,例如保留两位小数
formatted_df = result_df.withColumn("avg_rating", round(col("avg_rating"), 2))
results = formatted_df.toJSON().map(lambda j: json.loads(j)).collect()
return JsonResponse({'code': 200, 'data': results, 'message': 'success'})
except Exception as e:
return JsonResponse({'code': 500, 'message': str(e)})
def geospatial_analysis(request):
"""
核心功能三:地理空间分析
业务逻辑:统计上海各个行政区('district')的餐厅数量分布。
这个功能是地理空间分析的基础,可以用于生成热力图或区域分布柱状图,
帮助用户快速识别餐饮业发达的区域和有待开发的区域。
同样使用Spark SQL实现,因为它对于这类GROUP BY操作非常直观和高效。
"""
try:
df = spark.read.option("header", "true").option("inferSchema", "true").csv(HDFS_DATA_PATH)
df.createOrReplaceTempView("restaurants_geo")
# 编写Spark SQL查询,按'district'字段分组统计
query = """
SELECT district, COUNT(1) as restaurant_count
FROM restaurants_geo
WHERE district IS NOT NULL AND district != ''
GROUP BY district
ORDER BY restaurant_count DESC
"""
result_df = spark.sql(query)
# 将结果转换为前端需要的格式
# 比如可以处理成 Echarts 地图需要的 {name: '徐汇区', value: 5000} 格式
results = result_df.rdd.map(lambda row: {"name": row.district, "value": row.restaurant_count}).collect()
return JsonResponse({'code': 200, 'data': results, 'message': 'success'})
except Exception as e:
return JsonResponse({'code': 500, 'message': str(e)})
六、部分文档展示
七、END
💕💕文末获取源码联系计算机编程果茶熊