FEATURED · 精选文章

基于Spark的猫眼电影数据分析与推荐系统毕设项目全解析

发布时间 / 2026/8/30 5:54:12
来源 / 创域科博编辑部
栏目 / 资讯中心
基于Spark的猫眼电影数据分析与推荐系统毕设项目全解析 每年到了毕业设计季都会有一批计算机专业的学生面临同一个问题做什么题目才不至于在答辩时被老师问到冷场。如果你打开常见的毕设题目清单看到的大多是图书管理系统、电商网站、新闻发布系统、企业OA。这些项目不是不能做而是核心场景基本集中在增删改查技术栈单一区分度不高。遇到有经验的答辩老师三句话就能把深度问到底。如果你的方向是 Python 或大数据我建议换一种思路选一个能把数据采集、分布式存储、离线计算、Web 展示、推荐算法串成一条完整链路的题目。这篇文章要分享的就是一个典型的“全栈大数据”毕设项目——基于 Spark 的猫眼电影数据分析与推荐系统。它用 Spark 和 Hadoop 做数据处理用 Django 做 Web 展示再配合协同过滤推荐算法把大数据生态和 Web 开发完整地粘合在一个项目里。这篇文章会从选题价值、系统架构、环境搭建、核心代码实现、运行验证、常见问题、答辩建议几个角度完整拆解这个项目。无论你是准备拿它当毕业设计还是想通过一个综合项目理解大数据开发全流程这篇文章都值得收藏。1. 这个毕业设计项目为什么值得做1.1 大多数毕设项目的问题在哪里先说一个现实计算机专业本科毕设里最常见的问题是“技术栈太浅”。图书管理系统的本质是几个表和一组 CRUD 接口电商网站的本质是订单状态机加购物车逻辑这些项目在数据库课设、Web 课设阶段就已经反复练过。到了毕设阶段再做一次表面上工作量有了但技术上的增量很少。更麻烦的是这类项目在答辩时很难展开。老师问“你的系统遇到的最大性能瓶颈是什么”你只能回答“数据量大的时候查询变慢”老师问“为什么用 MySQL 而不用 Redis”你也很难给出真正经过权衡的答案。因为项目本身的复杂度撑不起这样的讨论。所以一个好的毕设题目应该满足三个条件有完整的数据链路从数据获取到数据展示每一环都有技术含量。有可深挖的模块至少有一个方向能让老师看出你理解了原理。有成熟的工程实践基础不是凭空造轮子而是用主流框架解决实际问题。1.2 这个项目的技术栈组合逻辑基于 Spark 的猫眼电影数据分析与推荐系统恰好满足上面三个条件。它的技术栈看起来很多但每一层都有明确分工爬虫负责从猫眼电影网站获取公开的电影榜单、评分、上映时间、类型等数据。Hadoop HDFS 负责存储原始数据让项目具备分布式文件系统的完整链路。Spark 负责离线数据分析比如评分 Top10、电影类型分布、年份评分趋势。推荐系统模块使用协同过滤算法给用户推荐相似电影。Django 负责 Web 端展示把分析结果和推荐结果呈现给用户。从数据采集到数据存储再到数据计算和数据展示这是一条完整的大数据流水线。对毕设来说它最大的优势是每一层都可以单独写进简历每一层也都可以在答辩时被深入追问。1.3 适合什么样的学生这个项目的门槛是中等偏上的。你需要熟悉 Python 基础语法了解 Django 的基本用法理解 DataFrame 的操作方式并且对推荐算法有初步认识。如果你是零基础直接从这个大项目入手会有些吃力建议先用一周时间补充 Python 和 SQL 基础再启动。反过来如果你已经学过 Python做过简单的 Web 项目但对 Spark 和 Hadoop 只停留在概念层面那这个项目正好能帮你把“听过的技术”变成“用过的技术”。从学习收益来看它远比再做一次 CRUD 项目要高。2. 核心概念与系统架构设计2.1 四个核心组件分别扮演什么角色很多初学者会混淆 Hadoop 和 Spark这里先把两者的分工讲清楚。Hadoop 是 Apache 基金会旗下的分布式基础架构核心组件包括 HDFS分布式文件系统和 YARN资源调度。在传统的大数据架构里Hadoop 负责“存储”和“资源管理”数据文件被切分成块分布到多台机器的 HDFS 上。Spark 是一个分布式计算引擎它本身不负责存储而是从 HDFS 或其他数据源读取数据然后在内存中完成计算。Spark 的核心优势是基于内存的计算模型适合迭代式算法和交互式数据分析。这也是推荐系统这类需要多次迭代计算的场景适合用 Spark 的原因。Django 则是 Python 社区最成熟的 Web 框架之一。它采用 MTVModel-Template-View架构自带 ORM、Admin 后台、表单处理、认证体系非常适合快速开发一个数据展示后台。在这个项目里Django 不承担任何分布式计算任务它只负责从 MySQL 或 SQLite 中读取 Spark 写好的分析结果然后渲染成页面。推荐系统是这个项目里最有深度的模块。常用的协同过滤算法分为两类基于用户的协同过滤User-Based CF和基于物品的协同过滤Item-Based CF。在电影推荐场景中基于物品的协同过滤更常用——它的核心思想是如果用户喜欢电影 A那么与电影 A 相似度最高的电影 B 也值得推荐给他。2.2 系统整体架构与数据流转这个项目的完整数据流转可以分成五步爬虫模块从猫眼电影公开页面抓取电影榜单数据保存为 CSV 文件。将 CSV 文件上传到 Hadoop HDFS完成分布式存储。Spark 从 HDFS 读取数据进行数据清洗、统计分析和特征加工。Spark 将分析结果写入 MySQL 数据库供 Web 端查询。Django 从 MySQL 读取数据渲染 Web 页面展示电影榜单、统计图表和推荐结果。这个流程的关键在于数据在每一层之间通过文件或数据库传递模块之间解耦。爬虫写好之后不需要每次重新抓取Spark 分析任务可以重复执行Django 页面只是一个展示壳。这种分层设计非常接近真实的大数据离线数仓项目。2.3 推荐系统的数据方案猫眼电影榜单本身只有电影静态信息没有用户评分行为数据。这一点需要提前说清楚如果直接基于猫眼榜单做协同过滤数据源是不完整的因为协同过滤需要“用户-物品-评分”三元组。常见的解决方案有两种。第一种是使用公开的 MovieLens 数据集。MovieLens 是明尼苏达大学 GroupLens 研究组发布的电影评分数据集包含大量真实的用户评分记录格式非常简单userId、movieId、rating、timestamp。用这份数据来演示 ALS 协同过滤算法结果可视化效果很好而且数据集规模不大本地跑起来没有压力。第二种是构造模拟用户评分数据。如果你的项目要求数据必须全部来自猫眼那可以通过 Django 注册登录功能记录用户在系统中的打分行为形成一个不断增长的真实评分表。这种方式更贴近生产环境但对项目完成度要求更高。从毕设角度更稳妥的做法是两者结合猫眼数据做整体分析和展示MovieLens 数据做推荐算法模块。这样既保证了项目主题统一又让推荐系统有真实可用的数据支撑。3. 环境准备与前置条件3.1 硬件与操作系统建议如果你的机器内存低于 8G建议优先考虑 Spark 的 local 模式也就是让 Spark 在单机本地运行不启动 Hadoop 集群。这样可以避免 HDFS 和 YARN 占用过多内存。如果你的内存是 16G 或以上可以尝试 Hadoop 伪分布式模式。伪分布式是指在一台机器上同时运行 HDFS 的 NameNode、DataNode以及 Spark 的相关进程它的配置方式和真实集群几乎一致只是所有节点都在同一台机器上。操作系统方面Windows 和 Linux 都可以。Windows 下需要额外注意 Hadoop 的 native 依赖问题建议使用 WSL 2 或直接装一个 Ubuntu 虚拟机可以省去很多环境层面的麻烦。3.2 软件清单与版本选择由于不同版本的 Spark、Hadoop、Python 之间存在兼容性要求这里不给出一个写死的版本号而是提供一个经过验证的选型思路Python 3.8 或 3.9这是 Spark 3.x 系列兼容性最好的 Python 版本区间。Spark 3.x自带 Spark SQL、MLlib支持 PySpark 接口。Hadoop 3.x 可作为 HDFS 存储层如果只做 local 模式Hadoop 不是必须的。Django 3.2 LTS 或 4.x长期支持版本更稳定。MySQL 5.7 或 8.0 用于存储分析结果本地开发也可以先用 SQLite 跑通再切 MySQL。安装顺序建议是Java → Hadoop → Spark → Python → Django → MySQL。Spark 运行在 JVM 之上所以 JDK 必须最先装好。3.3 环境验证安装完成后建议先执行两个最简单的命令验证环境。# 验证 Java 环境 java -version # 验证 Spark 环境 spark-shell --version如果spark-shell能正常打印版本信息说明 Spark 的核心安装没有问题。接下来验证 PySparkpython -c from pyspark.sql import SparkSession; print(PySpark OK)Django 的验证方式是创建一个临时项目django-admin startproject demo cd demo python manage.py runserver如果浏览器访问http://127.0.0.1:8000能看到 Django 的默认欢迎页说明 Django 环境就绪。4. 项目核心流程与代码实现4.1 项目目录结构设计一个清晰的目录结构对毕设项目尤为重要它既影响你写代码的效率也影响指导老师和答辩评审的第一印象。下面是一个推荐的分层结构maoyan_project/ ├── crawler/ # 数据采集模块 │ └── maoyan_spider.py ├── data/ # 本地临时数据 │ ├── maoyan_top100.csv │ └── movies.dat ├── jobs/ # Spark 分析任务 │ ├── movie_analysis.py │ └── movie_recommend.py ├── movie_web/ # Django 项目 │ ├── manage.py │ ├── movie_web/ │ │ ├── settings.py │ │ ├── urls.py │ │ └── wsgi.py │ └── movie_app/ │ ├── models.py │ ├── views.py │ ├── urls.py │ └── templates/ ├── docs/ # 文档报告 │ ├── 需求分析.md │ ├── 系统设计.md │ └── 答辩PPT提纲.md └── requirements.txt这个结构的核心思想是“按职责分模块”。爬虫、分析、Web 三块互不干扰后续扩展某一模块时不需要改动其他模块的代码。4.2 数据采集模块实现猫眼电影的 Top100 榜单页是一个公开页面通过 HTTP 请求可以获取到 HTML 内容。需要说明的是数据采集必须遵守目标网站的服务条款控制请求频率只采集公开信息不要使用高并发抓取也不得绕过反爬机制用于商业目的。下面是一个爬虫的骨架实现重点展示页面请求和字段提取的思路。# 文件路径crawler/maoyan_spider.py import re import time import requests import pandas as pd HEADERS { User-Agent: ( Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36 ) } def fetch_page(url): 请求页面并返回 HTML 文本 resp requests.get(url, headersHEADERS, timeout10) resp.raise_for_status() return resp.text def parse_movies(html): 从 HTML 中提取电影字段 # 此处的正则/选择器需要根据页面结构调整 pattern re.compile(ra href/films/(\d) title([^])) matches pattern.findall(html) return [ {movie_id: mid, title: title} for mid, title in matches ] def get_top100(): 抓取 Top100 榜单数据 movies [] for offset in range(0, 100, 10): url fhttps://maoyan.com/board/4?offset{offset} html fetch_page(url) movies.extend(parse_movies(html)) time.sleep(1) # 控制请求频率避免对目标站点造成压力 return movies if __name__ __main__: result get_top100() df pd.DataFrame(result) df.to_csv(data/maoyan_top100.csv, indexFalse, encodingutf-8-sig) print(f共抓取 {len(df)} 条电影数据)这里的parse_movies函数只给出了正则提取的思路。真实场景中猫眼的页面结构可能发生变化你需要用浏览器开发者工具查看 HTML提取电影名、主演、上映日期、评分等字段的具体位置再调整选择器。这是毕设项目中非常自然的“排错”过程也建议在文档里记录这个问题。4.3 Spark 数据分析模块实现拿到 CSV 数据后Spark 分析模块负责完成两类任务数据清洗和统计指标计算。下面用 PySpark 的 DataFrame API 实现一个分析任务。# 文件路径jobs/movie_analysis.py from pyspark.sql import SparkSession from pyspark.sql.functions import col, avg, count, desc, split, explode spark SparkSession.builder \ .appName(MaoyanMovieAnalysis) \ .master(local[*]) \ .getOrCreate() # 读取本地 CSV如果有 HDFS 环境可以换成 hdfs://path df spark.read.csv( data/maoyan_top100.csv, headerTrue, inferSchemaTrue ) # 查看数据基本结构 df.printSchema() df.show(5) # 统计评分最高的 10 部电影 top10_movies df.select(title, score) \ .orderBy(desc(score)) \ .limit(10) # 统计不同年份上映电影的平均评分 year_score df.groupBy(year) \ .agg(avg(score).alias(avg_score)) \ .orderBy(desc(year)) # 统计电影类型分布 # 假设 types 字段为逗号分隔的多个类型 type_stats df.withColumn(type, explode(split(col(types), ,))) \ .groupBy(type) \ .agg(count(type).alias(cnt)) \ .orderBy(desc(cnt)) # 将结果写入 MySQL需要提前在 MySQL 中建好数据库和表 top10_movies.write \ .mode(overwrite) \ .format(jdbc) \ .option(url, jdbc:mysql://localhost:3306/maoyan_db) \ .option(dbtable, top10_movies) \ .option(user, root) \ .option(password, your_password) \ .save() spark.stop()这段代码里有几个关键点inferSchemaTrue让 Spark 自动推断字段类型可以省去手动指定 schema 的步骤。explode(split(col(types), ,))用于把一行中的多类型字段拆成多行这是数据分析中非常常用的炸裂操作。.mode(overwrite)表示每次运行分析任务时覆盖旧结果保证数据是幂等的。生产项目中更推荐append加分区字段的方式但毕设里overwrite更直观。如果不想使用 MySQL也可以让 Spark 把结果直接写成 CSV 或 Parquet 文件Django 再读取文件展示。但这种方式的实时性差一些而且在多人演示时容易遇到文件路径不统一的问题。使用 MySQL 是更接近生产环境的方案。4.4 Django Web 展示模块实现Django 在这个项目中的角色非常简单从数据库读数据渲染 HTML 页面。下面是核心的 models、views 和 urls 代码。# 文件路径movie_web/movie_app/models.py from django.db import models class Movie(models.Model): movie_id models.CharField(max_length50, uniqueTrue) title models.CharField(max_length200) score models.FloatField(default0.0) year models.IntegerField(nullTrue, blankTrue) types models.CharField(max_length100, blankTrue) # 后续如果接入推荐结果可以增加推荐字段或单独建表 def __str__(self): return self.title class Meta: db_table movie# 文件路径movie_web/movie_app/views.py from django.shortcuts import render from .models import Movie def movie_list(request): 电影排行榜页面 movies Movie.objects.all().order_by(-score)[:20] return render(request, movie_app/movie_list.html, {movies: movies}) def detail(request, movie_id): 电影详情页同时展示推荐结果 movie Movie.objects.get(movie_idmovie_id) # 这里可以在后续接入推荐算法模块的输出 recommend_list Movie.objects.filter(types__containsmovie.types[:2]) \ .exclude(movie_idmovie_id)[:6] return render(request, movie_app/detail.html, { movie: movie, recommend_list: recommend_list, })# 文件路径movie_web/movie_app/urls.py from django.urls import path from . import views urlpatterns [ path(, views.movie_list, namemovie_list), path(movie/str:movie_id/, views.detail, namemovie_detail), ]这里有一个小技巧在detail视图中先用types__contains按电影类型做粗粒度的相似匹配排除当前电影后取前 6 条作为推荐列表。这种方式在数据量少时也能给出可用结果适合作为推荐算法的基线版本。4.5 推荐系统模块实现推荐系统模块是项目深度的核心来源这里的实现方案建议采用 ALS 协同过滤算法。ALS交替最小二乘法是 Spark MLlib 内置的矩阵分解算法专门用于处理协同过滤问题。它的原理可以这样理解假设用户和电影之间存在一个评分矩阵但矩阵中大量位置是空的ALS 通过不断迭代把矩阵分解成“用户特征矩阵”和“电影特征矩阵”用这两个矩阵的乘积来预测缺失的评分。使用 MovieLens 数据进行算法的完整代码# 文件路径jobs/movie_recommend.py from pyspark.sql import SparkSession from pyspark.ml.recommendation import ALS from pyspark.ml.evaluation import RegressionEvaluator spark SparkSession.builder \ .appName(MovieRecommender) \ .master(local[*]) \ .getOrCreate() # 读取评分数据CSV 格式为 userId,movieId,rating,timestamp ratings spark.read.csv( data/ml-100k/u.data, headerFalse, inferSchemaTrue ).toDF(userId, movieId, rating, timestamp) # 切分训练集和测试集 train, test ratings.randomSplit([0.8, 0.2], seed42) # 构建 ALS 模型 als ALS( userColuserId, itemColmovieId, ratingColrating, coldStartStrategydrop, maxIter10, regParam0.1, rank10 ) model als.fit(train) # 在测试集上评估 predictions model.transform(test) evaluator RegressionEvaluator( metricNamermse, labelColrating, predictionColprediction ) rmse evaluator.evaluate(predictions) print(fRoot Mean Squared Error {rmse}) # 为每个用户推荐 10 部电影 user_recommendations model.recommendForAllUsers(10) user_recommendations.show(5, truncateFalse)ALS 模型里有几个需要调参的超参数rank矩阵分解的隐含特征数。值越大模型表达能力越强但也更容易过拟合。MovieLens 100K 数据集上 10 到 20 是比较常见的范围。regParam正则化参数用来防止过拟合。一般从 0.01 到 0.1 之间尝试。maxIter最大迭代次数。ALS 是迭代算法10 次是一个比较折中的选择。评估结果 RMSE 表示预测评分与真实评分之间的平均误差数值越小越好。在 MovieLens 100K 数据集上RMSE 在 0.9 左右属于正常水平。5. 运行流程与效果验证5.1 准备数据先把爬虫运行起来生成maoyan_top100.csvpython crawler/maoyan_spider.py运行成功后用 Pandas 或 Excel 打开 CSV 确认字段完整性。至少应包含电影名、评分、年份、类型这四个字段。如果爬虫因为页面结构变化无法获取数据可以先用少量手写数据或公开数据集替代 CSV 文件先把整条链路跑通再回头调整爬虫。这是非常实用的问题处理顺序。5.2 执行 Spark 分析任务python jobs/movie_analysis.py如果本地环境变量配置正确Spark 会输出一段运行日志包含任务执行进度。最后看到Root Mean Squared Error ...或者看到 MySQL 中top10_movies表里出现了数据就说明分析任务执行成功。这里有一个常见的验证方法不要只看日志是否报错而是主动去 MySQL 中查询一下结果SELECT * FROM maoyan_db.top10_movies ORDER BY score DESC;5.3 启动 Django 项目先执行数据库迁移然后启动开发服务器python manage.py makemigrations python manage.py migrate python manage.py runserver浏览器访问http://127.0.0.1:8000如果能看到电影列表页面说明 Web 展示正常。5.4 预期效果与完整演示流程一个完整的演示流程应该是这样的首页展示电影 Top10 排行榜评分按从高到低排序。点击任意电影进入详情页页面展示电影的评分、年份、类型信息。详情页下方展示“相似电影推荐”推荐结果来自推荐算法模块。如果使用 MovieLens 数据训练的 ALS 模型可以在后台做一个“用户推荐接口”输入 userId 返回该用户的 Top 10 推荐电影。这样的演示逻辑从数据到展示层层递进答辩时能覆盖到每个技术模块。6. 常见问题与排查思路6.1 环境类问题问题现象可能原因排查方式解决方案Spark 启动失败提示找不到 JavaJAVA_HOME 未配置或配置错误执行java -version确认 JDK 可用在环境变量中正确配置 JAVA_HOMEPySpark 导入报错Python 版本与 Spark 不兼容查看完整堆栈日志切换为 Python 3.8 或 3.9spark-submit找不到主类提交参数错误检查命令行参数格式使用python jobs/movie_analysis.py方式运行Django 启动后页面样式丢失未配置 static 目录查看浏览器控制台 404 报错确认STATIC_URL配置正确6.2 数据与业务逻辑类问题问题现象可能原因排查方式解决方案中文乱码CSV 编码格式与读取格式不一致用编辑器打开查看二进制头部写入时使用utf-8-sig编码评分字段为 null页面解析时未取到字段打印原始 HTML 对比结构变化调整正则或选择器推荐结果为空coldStartStrategy设置不当检查模型输出的 predictions 数量设置coldStartStrategydropMySQL 写入失败表结构不匹配或权限不足查看 JDBC 报错信息手工建表确认字段类型一致内存溢出Spark 默认分配内存不够查看 Spark UI 的 Executor 内存在启动参数中加入--driver-memory 4g6.3 数据采集合规提醒数据采集模块是本项目中必须谨慎处理的环节。这里再次强调爬虫程序只能用于学习研究目的需要遵守目标网站的 robots 协议和服务条款控制请求 QPS不能用于商业用途。如果你的科目要求演示爬虫建议在文档和代码注释中写清楚“仅用于教学研究”。如果对数据合规有疑问完全可以跳过爬虫环节使用公开数据集直接完成后续分析任务。7. 工程化建议与答辩准备要点7.1 代码层面的规范化毕设项目虽然不像生产系统那样要求极高但代码规范程度直接影响评审印象。建议做到以下几点所有配置项集中管理。数据库连接信息、密码、端口等不要硬编码在业务代码里至少在config.py或 Django 的settings.py中统一定义。日志要能定位问题。在爬虫和 Spark 任务中关键步骤要打印日志例如“开始抓取第 1 页”“成功写入 100 条数据”。这样排错时不需要靠猜。写 README。README 中要写清楚项目简介、环境要求、启动步骤、数据来源以及每个脚本的用途。这项工作对答辩非常有价值相当于给评审老师一个快速理解项目的入口。7.2 数据架构层面的建议在开发过程中建议按“先本地后集群”的顺序推进。先用 Spark local 模式跑通代码再考虑 Hadoop 伪分布式或真实集群。如果一上来就搭建三台机器的集群环境问题会占用大量时间而且这些问题与项目本身的算法逻辑无关。对于 Django 和 Spark 的关系要有一个清晰边界Django 只负责 Web 展示不负责分布式计算Spark 只负责离线分析不负责用户交互。这样的职责划分在写论文和做答辩表述时也会非常清晰。7.3 答辩时的表述要点很多学生在答辩时容易陷入“讲代码细节”的泥潭。正确的做法是技术选型逻辑优先代码细节按需展开。每个技术选型都应该能回答一个“为什么”为什么用 Spark 而不是纯 Pandas因为 Spark 基于分布式内存计算可以处理超出单机内存的数据量而且它自带 MLlib 机器学习库方便实现推荐算法。为什么用 Hadoop HDFS因为 HDFS 提供了分布式存储的完整链路让项目具备大数据系统的基本形态。为什么用 Django因为 Django 自带 ORM 和管理后台开发效率高适合快速构建数据展示平台。为什么用协同过滤而不是基于内容的推荐因为协同过滤只需要用户行为数据不需要复杂的物品特征工程而且 ALS 在 Spark MLlib 中有成熟实现理论与实践结合更紧密。把这些“为什么”准备好答辩时的底气会比单纯背代码强得多。7.4 论文结构建议如果学校要求提交毕业论文建议按照以下章节组织绪论研究背景、国内外研究现状、研究内容与意义。相关技术介绍Python、Spark、Hadoop、Django、推荐算法。需求分析项目功能需求、非功能需求、可行性分析。系统设计总体架构、功能模块设计、数据库设计。系统实现爬虫实现、数据分析实现、推荐算法实现、Web 展示实现。系统测试功能测试、性能测试、结果分析。总结与展望。这个结构也是一个标准的软件工程过程写起来不容易跑偏。8. 总结与后续扩展方向这个项目的核心价值在于它把数据采集、分布式存储、分布式计算、Web 后端和推荐算法串成了完整链路。和你只做一个 Django 管理后台相比它多出了两个极具区分度的模块Spark 数据分析模块和推荐算法模块。这两个模块既可以独立深挖也可以和 Web 端配合演示非常适合在毕业设计中展示你的综合工程能力。如果你决定启动这个项目我的建议是先跑通最小链路——手写 20 条电影数据Django 直接读取展示然后接入 Spark 分析写入 MySQL最后再处理爬虫数据量和推荐算法。不要试图一天之内把所有模块全部完成按阶段推进每完成一个阶段就验证一次这样定位问题会容易得多。后续如果你想继续深入可以从这几个方向扩展用 Kafka 做实时数据接入把 Spark Streaming 或 Structured Streaming 加进来改用 Elasticsearch 做搜索引擎在推荐模块中用 FM 或 DeepFM 算法替代 ALS把 Django 前端改成 Vue 前后端分离架构。每一条扩展路径都能让这个项目的技术含量再上一个台阶。
RELATED — 相关阅读

相关资讯

LATEST — 最新资讯

最新发布

TODAY — 本日精选

新闻

WEEKLY — 本周精选

新闻

MONTHLY — 本月精选

新闻