# 基于Spark的外卖数据分析设计与实现 **Repository Path**: faizyan/Takeaway ## Basic Information - **Project Name**: 基于Spark的外卖数据分析设计与实现 - **Description**: 本项目是一个基于Apache Spark和Scala的大数据外卖订单分析与推荐系统。系统通过分析用户的历史订单数据,提供实时和离线的多维度数据分析与可视化,以及个性化菜品推荐服务。系统前端使用Vue 3框架开发,基于Arco Design UI组件库和ECharts可视化库,使用MySQL作为前后端数据交互媒介,数据分析采用Spark实现。这是后端部分 - **Primary Language**: Scala - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 4 - **Forks**: 1 - **Created**: 2025-06-26 - **Last Updated**: 2025-08-23 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 外卖订单推荐与分析系统 这是一个基于Apache Spark和Scala的大数据外卖订单分析与推荐系统。系统通过分析用户的历史订单数据,提供实时和离线的多维度数据分析与可视化,以及个性化菜品推荐服务。系统使用MySQL作为前后端数据交互媒介,采用纯Spark实现。 ## 1. 系统架构 该系统采用前后端分离架构,由以下主要部分组成: ### 1.1 前端部分(已完成) - 使用Vue 3框架开发,基于Arco Design UI组件库和ECharts可视化库 - 提供离线分析、实时分析和离线推荐三个主要功能页面 - 前端通过MySQL数据库获取数据,无需直接与后端交互 ### 1.2 后端部分 - 基于Scala和Apache Spark开发,包含以下主要模块: - 离线分析模块:使用Spark SQL处理历史订单数据 - 实时分析模块:使用Spark Streaming处理实时订单数据 - 推荐模块:使用Spark MLlib的ALS算法构建推荐模型 - 数据持久化:所有分析结果和处理数据存入MySQL数据库 ### 1.3 数据流程 - 离线数据处理流程:原始数据文件 -> Spark SQL -> MySQL -> 前端可视化 - 实时数据处理流程:原始数据文件 -> test.sh脚本 -> Flume -> Kafka -> Spark Streaming -> MySQL -> 前端可视化 ## 2. 功能模块 ### 2.1 离线分析 提供以下功能: - 年龄段分布分析:不同年龄段用户的订单分布 - 性别比例分析:男女用户的订单比例 - 地区分布分析:不同城市的订单分布 - 菜品类别偏好分析:用户对不同菜品类别的偏好 - 消费金额分析:各价格区间的订单分布和平均消费 - 活跃时段分析:不同时段的订单分布 - 平台分析:不同外卖平台的订单分布 ### 2.2 实时分析 提供以下功能: - 实时数据概览:当前订单总量、每分钟订单数、平均订单金额和活跃城市数 - 地区分布实时分析:不同城市的实时订单分布 - 外卖品类实时分析:不同菜品品类的实时订单分布 - 活跃时间段实时分析:不同时段的实时订单分布 - 商铺订单实时分析:不同商铺的实时订单分布 - 平台实时分析:不同外卖平台的实时订单分布 ### 2.3 离线推荐 提供以下功能: - 热门品类推荐:基于历史订单量推荐热门菜品 - 热门商铺推荐:基于历史订单量推荐热门商铺 - 热门平台推荐:基于历史订单量推荐热门外卖平台 - 个性化推荐:基于用户历史订单,推荐相似但用户未尝试过的菜品 - 基于时段的推荐:根据时段推荐不同的菜品 ## 3. 数据处理流程 ### 3.1 离线数据处理 1. 从原始数据文件中读取订单数据 2. 使用Spark SQL进行多维度分析 3. 将分析结果存入MySQL数据库 4. 前端从MySQL数据库获取数据并进行可视化展示 5. 原始数据示例: ``` 订单ID,用户ID,年龄,性别,商铺名称,菜品名称,菜品类别,价格,城市,时间段,平台,评分,下单时间 1,48826,29,女,快乐餐厅,锅包肉,特色菜,118.42,柳州,午餐,饿了么,3,2025-01-16 13:50:16 ``` ### 3.2 实时数据处理 1. 使用test.sh脚本模拟实时读取原始数据文件中的订单数据 2. 将数据发送至Flume 3. Flume将数据传输至Kafka消息队列 4. Spark Streaming实时消费Kafka数据并进行分析 5. 将分析结果实时写入MySQL数据库 6. 前端通过轮询从MySQL获取最新数据并更新可视化图表 ### 3.3 推荐系统处理 1. 使用Spark MLlib的ALS(交替最小二乘法)算法构建推荐模型 2. 基于用户-商品评分矩阵训练模型 3. 为每个用户生成个性化推荐列表 4. 将推荐结果写入MySQL数据库 5. 前端从MySQL数据库获取推荐结果并展示 ## 4. 运行指南 ### 4.1 环境准备 - JDK 1.8+ - Scala 2.13 - Apache Spark 3.3.1 - MySQL 5.7+ - Kafka 3.3.1 - Flume ### 4.2 数据库初始化 在运行应用前,需要初始化MySQL数据库: ```bash # 进入MySQL命令行 mysql -u root -p Niit@123 # 执行SQL脚本 source init_database.sql ``` ### 4.3 运行方式 #### 实时分析模块 ```bash # 进入项目目录 cd Takeaway-master #### 实时分析模块 ```bash # 先启动Flume和Kafka flume-ng agent -n a1 -f /usr/local/flume/jobs/file_to_kafka_BD1.conf # 启动模拟数据生成脚本 sh /export/data/mock/test.sh ## 5. 配置说明 ### 5.1 数据库配置 ```scala // 数据库配置 val jdbcUrl = "jdbc:mysql://node1:3306/takeaway?useSSL=false&serverTimezone=UTC" val jdbcUsername = "root" val jdbcPassword = "Niit@123" ``` ### 5.2 Kafka配置 ```scala // Kafka配置 val kafkaBootstrapServers = "node1:9092" val kafkaGroupId = "takeaway-group" val kafkaAutoOffsetReset = "latest" val kafkaTopic = "new_takeaway" ``` ## 6. 项目目录结构 ``` src/main/scala/org/niit/ ├── app/ # 应用程序入口 │ ├── offline/ # 离线分析应用入口 │ │ └── BatchDataApp.scala # 离线分析主程序 │ └── online/ # 实时分析和推荐应用入口 │ ├── RealTimeAnalyseApp.scala # 实时分析主程序 │ └── RecommendApp.scala # 推荐系统主程序 ├── bean/ # 样例类。对实时获取的数据,或者离线的数据文件中 读取的数据 要进行封装到样例类到中,便于模块与模块之间的传输 ├── common/ # 通用接口和类,存放一些通用的代码,不用重复的创建、获取 ├── dao/ # 持久层。 对数据库的操作,对数据库的增删改查 │ ├── OfflineAnalysisDao.scala # 离线分析数据访问 │ ├── RealtimeAnalysisDao.scala # 实时分析数据访问 │ └── RecommendDao.scala # 推荐系统数据访问 ├── service/ # 业务逻辑层 │ ├── OfflineAnalysisService.scala # 离线分析服务 │ ├── RealtimeAnalysisService.scala # 实时分析服务 │ └── RecommendService.scala # 推荐系统服务 └── util/ # 工具类 ├── ConfigUtil.scala # 配置工具类 └── JDBCUtil.scala # JDBC工具类 ``` ## 7. 系统实现细节 ### 7.1 离线分析模块 - 使用Spark SQL进行数据分析,支持各种聚合和统计操作 - 根据不同维度(年龄、性别、地区等)进行分组和统计 - 将分析结果保存到MySQL数据库中,供前端展示 ### 7.2 实时分析模块 - 使用Spark Streaming消费Kafka数据,每5秒处理一批次数据 - 对实时数据进行聚合和统计,计算各种指标 - 实时更新MySQL数据库中的结果 ### 7.3 推荐系统模块 - 基于统计的推荐:根据历史订单数据,推荐热门品类、商铺和平台 - 基于时段的推荐:根据不同时段(早餐、午餐、晚餐等)推荐不同的菜品 - 个性化推荐:使用ALS协同过滤算法,基于用户历史评分,生成个性化推荐 ## 8. 未来改进方向 ### 8.1 功能增强 - 增加更多维度的分析,如消费趋势、用户行为等 - 优化推荐算法,结合内容特征和协同过滤 - 实现实时推荐功能 ### 8.2 性能优化 - 优化Spark作业配置,提高处理效率 - 引入数据库连接池,减少连接开销 - 使用缓存机制,减少数据库访问压力 ### 8.3 架构改进 - 引入消息队列进行系统解耦 - 使用微服务架构,增强系统扩展性 - 使用容器化部署,简化环境配置 # 注意:如果运行时出现找不到主类可能是因为编译问题可以运行:mvn clean compile 重新编译 #### 技术支持:@Faiz