尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

招聘大数据分析毕业设计:Hadoop+Spark+Hive全流程与推荐系统

发布时间:2026/9/29 3:38:10

资讯中心
01
ARTICLE

招聘大数据分析毕业设计:Hadoop+Spark+Hive全流程与推荐系统

招聘大数据分析毕业设计:Hadoop+Spark+Hive全流程与推荐系统
1. 项目全景招聘大数据分析毕业设计到底在做什么带过不少计算机毕业设计也见过大量学生拿着一份三件套源码、论文、PPT的题目来问怎么讲解。说实话像“Hadoop Spark Hive 招聘大数据分析可视化 招聘推荐系统”这种题目是每年大数据方向毕业设计里出现频率最高的一类。不是因为题目有多新鲜而是因为它把大数据技术栈里最核心的几个组件全部串起来了Hadoop负责底层存储和计算资源调度Spark负责数据的清洗和挖掘Hive负责离线数仓的构建最后再叠加一个推荐系统和可视化大屏一个完整的“数据工程闭环”就出来了。这个系统能解决什么问题站在业务视角招聘平台积累了大量职位信息和用户投递行为但海量数据躺在数据库里只是“存储”不是“资产”。通过这套系统你可以分析出不同城市、不同行业、不同经验要求的薪资分布可以挖掘出哪些技能是当前市场的硬通货可以根据用户的历史浏览和投递行为推荐可能感兴趣的职位。站在毕业设计答辩视角这些功能点每一个都能讲出原理、讲出代码、讲出调优过程不愁没内容讲也不怕答辩委员会追问。适合谁来参考先说清楚如果你已经具备基本的Java或Python基础但没系统接触过Hadoop生态这篇文章的实操部分你可以直接照着走如果你只是想把系统跑通交差那更得看第6节的踩坑记录能帮你省下至少一周的调试时间。下面我会按照从架构、环境、数据处理、推荐算法、可视化到问题排查的顺序把整个项目从零拆一遍。2. 整体设计与架构思路别急着写代码先把数据流画明白2.1 六大模块与一条完整数据链路这个系统最值得讲的地方是它的数据链路非常完整。我从设计上拆成了六个模块对应了大数据开发的典型分工数据采集层负责获取招聘网站的职位信息、公司信息、用户行为日志。实际项目中通常用Python爬虫或者构造模拟数据集。数据清洗层基于Spark做ETL处理缺失值、重复数据、薪资字段解析、时间格式统一。数据仓库层用Hive建立分层数仓ODS层放原始数据DWD层放清洗后的明细数据ADS层放聚合结果。数据分析层使用Spark SQL或者Hive SQL完成各类统计指标的计算。推荐引擎层基于用户行为数据计算推荐结果支撑职位推荐。可视化展示层通过图表大屏展示分析结果便于业务决策。这六个模块并不是各干各的而是通过一条“数据管道”串联起来的。在动手做之前我强烈建议你先把下面这条链路画在白板上爬虫/模拟数据产生的原始数据 → Spark作业清洗落盘到Hive分区表 → Hive中按业务主题构建宽表 → 分析任务跑出统计指标写入MySQL或HBase → 后端接口读取指标数据返回给前端图表 → 同时推荐服务基于Hive中的用户行为表计算推荐列表写入Redis或数据库 → Web展示层拉取展示。别小看这张数据流图它就是你毕业设计论文的“系统架构图”原型也是你答辩时第一个要讲清楚的东西。很多同学代码写完了但讲不明白数据流向答辩直接被问住就是这个环节没打牢。2.2 技术选型为什么偏偏是这三个组件选择Hadoop、Spark、Hive的组合不是因为它们性能最好而是因为它们最“教学友好”也最符合企业大数据离线数仓的真实逻辑。Hadoop解决的是“存储和基础计算”的问题。HDFS分布式文件系统把大文件切成块存放在多个节点上配合NameNode管理元数据、DataNode存储数据。你要理解HDFS副本机制默认3副本的配置让系统能够容忍节点故障。这个组件能让你直观感受到“分布式”到底是什么概念。Hive解决的是“用SQL方式操作大数据”的问题。它本质上是一个SQL解析引擎把HQL语句翻译成MapReduce或Spark作业去执行。选它的好处是你不需要写复杂的Java代码用类SQL的语法就能完成数据分析这大大降低了数据处理的门槛也让你的毕业设计代码量可控。Spark解决的是“计算效率”的问题。它的核心卖点是基于内存计算比纯MapReduce快很多。在项目中数据清洗和推荐算法的计算部分用Spark实现能够体现性能优势这也是论文里可以重点写“性能对比实验”的地方。你在技术选型问答环节可以准备一个对比为什么不选Flink因为Flink强项在实时流处理而招聘分析场景以离线批处理为主Spark的批处理更成熟稳定。为什么不选ClickHouse做分析因为ClickHouse虽然查询极快但它不承担ETL和数仓建模的责任用在这里会削弱Hadoop生态的完整性。这些对比话术建议你原样记进论文的“可行性分析”章节。2.3 模块之间的关系与依赖模块间依赖关系最容易让新手混乱的地方在于Hive和Spark的边界。记住这条判断标准凡是要写复杂业务逻辑和算法的用Spark代码凡是针对明细数据做聚合统计的用Hive SQL。Hive的UDF、UDAF可以注册成Spark SQL的函数Spark也能直接读写Hive表两者通过MetaStore进行元数据共享。需要强调的是Hive和Spark的整合有一个前置条件必须配置好Hive MetaStore服务并且让Spark知道Hive的元数据存储位置。在第3节的配置部分我会给出具体操作。整个项目如果把这层关系理顺了后面写代码基本不会卡壳怕就怕在糊里糊涂搭完环境连数据落在哪张表里都不清楚那后面的推荐和可视化就无从谈起。3. 环境搭建从伪分布式到Spark On Yarn的完整落地3.1 版本搭配是最大的隐形坑环境搭建阶段90%的同学踩的坑不是操作不熟而是版本不匹配。这个项目的技术栈跨了多个组件任何一个版本不兼容都会让你在后续部署时怀疑人生。我当时使用的是一套经过验证的稳定组合现在拿出来可以直接抄作业组件建议版本说明JDK1.8Hadoop 3.x仍以JDK8为主流别贪新用JDK17Hadoop3.1.3支持NameNode HA稳定性好Spark2.4.7或3.1.22.4.7兼容性最稳3.1.2有更好的SQL支持Hive2.3.7与Hadoop 3.1.x兼容良好Zookeeper3.4.14主要给Hadoop HA和Hive使用MySQL5.7存放Hive元数据及最终分析结果这套组合我编译部署过不止一次可以负责任地说只要按照这个版本表来冲突会少很多。如果你非要全部用最新版那你需要做好自己动手编译和解决依赖冲突的准备毕业设计阶段真心不建议这么折腾。3.2 Hadoop伪分布式搭建的关键步骤如果是单机做毕业设计没有必要上三节点集群伪分布式完全够用也方便演示。所谓伪分布式就是在一台机器上同时运行NameNode、DataNode、ResourceManager、NodeManager这些进程。第一步配置SSH免密登录。这是最容易忽略的步骤很多同学直接跳过然后每次启动集群都要输入密码非常痛苦。执行 ssh-keygen -t rsa一路回车生成密钥再把公钥追加到authorized_keysssh-keygen -t rsa -P -f ~/.ssh/id_rsa cat ~/.ssh/id_rsa.pub ~/.ssh/authorized_keys chmod 600 ~/.ssh/authorized_keys第二步修改hadoop-env.sh中的JAVA_HOME。这步看着简单但很多人直接写echo $JAVA_HOME的结果结果因为路径有空格或者权限问题导致启动失败。用一个绝对路径比如/usr/lib/jvm/java-1.8.0-openjdk。第三步修改四个配置文件。core-site.xml配置NameNode地址和临时目录hdfs-site.xml配置副本数和NameNode目录yarn-site.xml配置资源管理器mapred-site.xml指定使用YARN作为MapReduce框架。一套可以直接跑的伪分布式核心配置大概是这样的!-- core-site.xml -- configuration property namefs.defaultFS/name valuehdfs://localhost:9000/value /property property namehadoop.tmp.dir/name value/home/bigdata/hadoop/tmp/value /property /configuration配置完成后先执行 hdfs namenode -format 格式化NameNode然后执行 start-all.sh 启动所有进程。用 jps 命令检查如果看到NameNode、DataNode、ResourceManager、NodeManager四个进程都在说明Hadoop环境已经通了。很多同学卡在DataNode起不来最常见的原因是格式化之后又多次格式化导致NameNode的namespaceID和DataNode不一致这时候需要清空tmp目录后重新格式化。3.3 Zookeeper整合与Spark On Yarn配置项目里引入Zookeeper主要是给Hadoop NameNode的高可用和HiveServer2做协调服务同时Spark访问Hive也需要通过它来保证元数据服务的稳定性。搭建Zookeeper本身不复杂解压后修改zoo.cfg指定dataDir和clientPort单机模式直接启动即可。检验方式是用 zkServer.sh status 看到Mode: standalone。Spark和Hive整合是这里最需要小心的一步。你需要做两件事第一把Hive的配置文件hive-site.xml复制到Spark的conf目录下让Spark作业能连接到Hive MetaStore第二确保Spark的jars目录里有mysql-connector-java驱动否则Spark读写Hive表时会报找不到元数据驱动。Spark On Yarn模式的提交命令长这样spark-submit \ --class com.example.JobRecommendation \ --master yarn \ --deploy-mode client \ --driver-memory 2g \ --executor-memory 2g \ --num-executors 2 \ /home/bigdata/jar/job-recommend.jar配置完成后你要验证一件事在Spark Shell里执行 spark.sql(show databases)如果能正常返回说明Spark写Hive的链路是通的。这一步是后续数据清洗和推荐计算的地基地基不稳后面全塌。4. 数据工程实战采集、清洗与数仓建模4.1 招聘数据从哪来爬虫与模拟数据双保险招聘数据的获取有两类方案你可以根据自己情况选择。第一类是写Python爬虫用requests加BeautifulSoup采集招聘网站的公开职位数据。这类方案的风险在于目标网站的反爬机制建议采集请求间隔设置在3到5秒设置User-Agent最好使用代理池。如果不想冒风险可以选择第二类方案自己编写数据生成脚本用Faker库按业务规则模拟生成2万条以上的招聘数据字段包括职位名称、公司名称、所在城市、薪资范围、工作经验要求、学历要求、技能标签、发布时间、所属行业。这里有个人经验要分享如果你是为了毕业设计答辩模拟数据和真实采集数据的区别并不大因为核心考点在数据清洗和分析能力上。模拟数据还可以让你精确控制数据分布比如保证每个城市的样本量、薪资金额在合理区间内这样后面可视化效果会更好看。我自己带学生做这个项目时会建议他们把采集脚本和模拟脚本都写了正文里用模拟数据跑通爬虫作为附录和大作业展示一举两得。原始数据的字段设计直接决定了后面所有工作的复杂程度务必想清楚再动手。一个基本可用的字段结构如下职位信息表job_id、job_name、company_name、city、salary_min、salary_max、experience、education、industry、skills、publish_date用户行为表user_id、job_id、action_type浏览/收藏/投递、action_time4.2 Spark ETL清洗从原始数据到高质量明细数据清洗这一步是工作量最大也是最能体现你“懂工程”的地方。我写的清洗逻辑包含五个环节去重、字段解析、缺失值填充、格式统一、异常值剔除。第一步去重招聘数据里同一职位可能被多个来源采到简单做法是只要job_id一样就视为重复用dropDuplicates即可。第二步薪资解析原始数据里的“10k-15k”是一个字符串需要拆成数字方便后续统计from pyspark.sql import functions as F from pyspark.sql.types import IntegerType def parse_salary(row): # 处理10k-15k、10K-15K、面议等格式 salary_str row.salary if 面议 in salary_str or salary_str is None: return (None, None) parts salary_str.lower().replace(k, ).split(-) if len(parts) 2: return (int(float(parts[0])), int(float(parts[1]))) elif len(parts) 1: val int(float(parts[0])) return (val, val) return (None, None)第三步统一时间格式publish_date字段在采集端可能是“2023-08-15”也可能是“2023/8/15”统一用to_date函数转换。第四步过滤异常值比如薪资为负、发布时间在未来、必要字段为空的数据要剔除。清洗完的DataFrame要写入Hive的DWD层分区表。注意写的时候按照日期字段做动态分区但动态分区会导致小文件问题我一般会在Spark写之前做一次coalesce控制分区内文件数量这个细节直接影响后续Hive查询性能。4.3 Hive数仓分层与建表策略Hive层的设计遵循经典数仓分层思路ODS层放原始数据DWD层放清洗后的明细数据ADS层放聚合指标结果。ODS表建表时使用外部表因为原始数据不应该让Hive管理生命周期删除表不能删数据。DWD表在ODS基础上增加了清洗后的字段比如拆好的薪资上下限、标准化的日期。ADS表则用于存放薪资分布、城市岗位量等聚合结果这些结果最终会被导出到MySQL供可视化使用。建表时有两个关键选择直接影响到后面能不能跑得快。第一存储格式选ORC不要选默认的TextFile。ORC是列式存储查询时只需要读涉及的列压缩比高对于这种多字段但查询列集中的场景优势巨大。第二分区字段的设计不能拍脑袋。如果你只有一个月的招聘数据按天分区分出30个分区没有意义如果数据跨了多个月按天分区就很有必要。我在项目里用的是按月分区既能保留时间维度又避免了过度分区导致的元数据膨胀。关于Hive的自定义函数我个人建议在项目里至少写一个UDF这是答辩加分项。比如写一个UDF来判断职位标签是否包含Java或Python输出技能分类。代码逻辑不复杂继承GenericUDF重写evaluate方法打包后add jar进去就能用。有了这个自定义UDF你的技术深度就能在答辩时直接展现出来。5. 推荐系统的设计与实现从协同过滤到冷启动兜底5.1 推荐算法选型为什么用协同过滤毕业设计阶段的推荐系统不需要上深度学习模型。招聘推荐业务有一个天然特点用户和职位的交互行为数据相对稀疏且用户兴趣会随求职状态快速变化。在可用数据有限的情况下基于物品的协同过滤Item-Based CF和基于用户的协同过滤User-Based CF是性价比最高的两个方案。我最终选的是User-Based CF加热度补偿的混合策略。核心思路很直观找到与当前用户历史行为最相似的一批用户看看这些相似用户在浏览什么职位、投了什么简历把其中当前用户没有交互过的职位推荐出来。这和现实生活里的“物以类聚、人以群分”逻辑一致和你背景相似的人都在投数据分析岗位你大概率也会对这个岗位感兴趣。这个方案能在答辩时讲清楚一个完整的故事数据从哪来、相似度怎么算、推荐结果怎么排、冷启动怎么做。比黑盒式的神经网络模型更容易让人信服也更容易把论文写厚。5.2 基于物品的协同过滤实现过程实现时把用户对职位的“行为”映射成评分浏览记1分收藏记2分投递简历记3分。这里有个经验说明一下不同行为加权这一点是推荐效果好坏的关键如果不加权只记浏览那么推荐结果会被热门职位淹没。整个计算流程分四步。第一步从Hive用户行为表读取数据。第二步计算职位之间的相似度使用余弦相似度每个职位用被行为打分的用户向量表示依次计算所有职位对之间的余弦距离。第三步为当前用户尚未交互过的职位计算推荐得分得分等于该职位与用户历史行为中每个职位的相似度乘以用户对历史职位的评分之和。第四步按照得分从高到低取前20个职位作为推荐候选。用Spark实现的核心代码结构大致是// 读取行为数据并构建评分矩阵 val interactions spark.table(dwd_interaction) val itemUserScore interactions.select(job_id, user_id, score) // 计算职位-职位相似度矩阵 val itemSimilarity itemUserScore .join(itemUserScore.toDF(job_id_j, user_id_j, score_j)) .where($user_id $user_id_j) .groupBy(job_id, job_id_j) .agg(F.sum($score * $score_j) as dot) // 再除以各职位的模长得到余弦相似度这里有一个性能点要提醒职位数量在一万级别时两两计算相似度是千万级别的计算量Spark还能扛住但如果数据量翻了十倍就必须引入更高效的近似最近邻算法。毕业设计阶段在Spark上跑全量计算并展示一次成功的结果已经足够了但你要在论文里写明这个扩展思路答辩时提到“面临规模问题可以如何优化”是非常加分的话术。5.3 冷启动与热度兜底推荐系统不能只会“算相似”协同过滤有一个著名的痛点新用户没有历史行为新职位没有交互记录这一类问题叫冷启动。招聘网站上每天都会有新注册用户如果推荐系统遇到新用户就推荐空白页那这个系统基本是废的。我的方案是叠加一个“热度兜底”层。计算每个职位的综合热度分热度分 浏览量0.2 收藏量0.3 投递量*0.5再把这个值作为影响因子加到推荐得分中。当用户的相似用户少、推荐置信度低时热度分的权重自动提高当用户行为丰富了协同过滤的权重逐步盖过热度和。具体实现时我会把推荐结果写入Redis缓存key设置为user_recommend:userIdvalue是职位ID列表设置24小时过期。这样用户每次打开页面时后端直接从Redis取结果响应速度快也能避免每次请求都触发一次Spark作业。对于用户量不大的毕业设计系统这个设计已经很有工业感了。5.4 推荐效果怎么评估别等答辩才想指标推荐系统做完之后很多人不知道该怎么证明它“有效”。答辩时被问到“你的推荐效果怎么样”如果只回答“感觉还行”那就尴尬了。正确的做法是准备离线评估指标准确率、召回率、覆盖率。把用户行为数据按时间切分前80%作为训练集后20%作为测试集。用训练集构建模型为测试集中的用户生成推荐列表检查推荐列表里有多少职位是测试集中用户真实交互过的。准确率 命中数/推荐总数召回率 命中数/测试集真实交互数。我当时跑出来的数据是准确率约0.18、召回率约0.29覆盖率约0.35不算优秀但在稀疏数据场景下属于正常水平。把这个评估过程和结果写进论文比贴十个界面截图都有说服力。6. 可视化分析与大屏展示6.1 分析指标怎么定才不空洞可视化大屏不能只是把数据堆上去核心是指标体系的设计。招聘分析业务的指标体系可以从三个维度拆市场规模维度职位总量、日新增职位数、行业分布Top10、城市岗位分布。薪资维度全国平均薪资、各城市平均薪资Top榜、薪资区间分布、不同经验段薪资中位数。人才要求维度学历要求占比、经验要求占比、热门前沿技能Top20、各行业技能需求对比。每个指标背后都要有一条对应的Hive SQL分析逻辑。比如“各城市平均薪资”的SQL是取DWD层数据按城市分组对薪资上下限取平均值。为了避免平均值被极端值带偏用中位数更稳健SQL里可以用percentile_approx函数计算薪资中位数。这些细节写进论文会让你的分析逻辑显得比同龄人严谨得多。6.2 可视化技术栈怎么选可视化层我推荐一套轻量但完整的方案Spring Boot提供后端接口 ECharts渲染图表 MySQL存储聚合结果 前端静态页面做看板。不推荐为了炫技引入重量级前端框架你的核心精力应该放在数据链路而不是前端工程化。后端接口的逻辑很简单从MySQL读取ADS层聚合表转化为JSON格式返回给前端。ECharts是开源且生态成熟的图表库地图、柱状图、饼图、词云都有现成配置对找工作也有一定的技能加分。6.3 大屏布局与图表联动细节一个大屏通常按业务模块分区布局。顶部放核心KPI卡片显示总职位数、总用户数、平均薪资。左侧区域放城市岗位分布地图和城市薪资Top榜。中间区域放薪资区间分布柱状图和学历要求占比饼图。右侧区域放技能热度词云和经验要求构成图。底部放行业分布横向条形图和近半年职位增长趋势折线图。图表联动是提升完成度的高级技巧。ECharts支持通过dispatchAction发出点击事件比如点击地图上某个城市其他图表同步过滤显示该城市的数据。这个联动看起来简单但能直观体现你对“交互式数据分析”的理解答辩时随手演示一下印象分会明显不一样。很多同学在一开始就花大量时间堆界面样式我建议反过来先把后端指标数据和SQL逻辑全部跑通再用ECharts做展示。因为界面的问题随时可改数据口径的问题到了后期再改就要动整条链路了。7. 常见问题排查与项目避坑实录7.1 集群层面DataNode起不来、Hive连不上我几乎每次搭建环境都会遇到有人卡在DataNode起不来的问题。现象是执行start-dfs.sh后jps看不到DataNode进程查看日志报“Incompatible clusterIDs”。原因是第一次格式化后data目录里已经生成了clusterID你再次格式化NameNode时生成了新的clusterIDDataNode和NameNode就会对不上。解决方案不是反复格式化而是把hdfs-site.xml指定的dfs.namenode.name.dir和dfs.datanode.data.dir目录里的旧文件全部清空然后重新格式化一次成功。Hive连不上的问题也很典型。启动hive命令报“Unable to instantiate org.apache.hadoop.hive.ql.metadata.SessionHiveMetaStoreClient”八成是MySQL元数据库没初始化。解决办法是先执行 schematool -dbType mysql -initSchema 初始化元数据再启动Hive。另外注意MySQL要允许远程访问Hive的JDBC连接串里要把localhost改成实际主机名或IP。7.2 性能层面Hive小文件问题与Spark内存溢出Hive查询慢最典型的元凶就是小文件过多。动态分区插入时每个分区如果都产生几百个小文件NameNode的压力和查询时的任务调度开销都会暴涨。缓解措施有两层。第一层在写入前控制Spark写Hive表之前用coalesce或repartition调整分区数每个输出分区尽量控制在128MB到256MB之间。第二层在写入后合并用Hive自带的小文件合并配置或者单独跑一个merge任务把同分区的小文件合并成大文件。-- Hive侧启用小文件自动合并 SET hive.merge.mapfilestrue; SET hive.merge.mapredfilestrue; SET hive.merge.size.per.task268435456; SET hive.merge.smallfiles.avgsize16777216;Spark内存溢出在跑推荐计算时很常见日志报shuffle阶段OOM。排查思路是先看Spark UI里的Executor使用情况是不是某个Executor的内存打满。解决办法分两步第一步把executor-memory加大并配上executor-cores举一个可用的配置组合1个核配2G到3G内存第二步优化代码里的shuffle用broadcast join替代大表与小表的reduce join。7.3 推荐层面结果为空和数据倾斜推荐结果为空的最常见原因是评分表里有的用户所有行为职位都在热门集合之外协同过滤算出的相似职位为空。处理方式就是我在5.3节说的热度兜底一旦候选集不足20个直接用热度Top职位补齐。这个逻辑一定要写进异常分支不然你在答辩演示时万一抽到一个行为稀疏的用户推荐列表空白当场会很尴尬。数据倾斜的经典现象是某个热门的职位ID导致所有计算都堆积到一个Executor上Spark UI里能看到一个Stage长时间卡住不结束。解决办法是在join或聚合时给key加盐把热门职位ID拆成多个带随机后缀的新key计算完成后再去掉后缀汇总。我处理这个问题的经验是花在定位倾斜原因上的时间通常比修复还长所以遇到Stage卡住第一时间检查是不是热点key的问题。7.4 答辩高频问题速查整理一份答辩时几乎必被问到的问题清单建议你把答案写在论文的附录里HDFS写文件时副本数为什么是3容错与写入开销的权衡可以提到机架感知。Hive和传统关系型数据库的区别Hive是分析型工具不适用于事务处理底层走批处理。为什么不直接用Spark取代Hive各司其职Hive负责元数据管理和SQL分析Spark负责ETL和算法计算。推荐系统的评估指标是什么准确率、召回率、覆盖率以及具体的数值。系统能处理多大的数据量根据你集群的资源给出一个量级估计比如每日千万条日志级别。如果数据量再提高一百倍系统哪里会成为瓶颈存储扩展、元数据管理、推荐计算规模每一条都要有自己的优化思路。8. 实操心得做完这个项目我最想说什么带过几轮选这个题目的学生每次做完复盘大家的感受都惊人的一致最难的环节不是写推荐算法也不是可视化配置而是环境搭建和数据链路打通。环境问题看起来不涉及算法但它消耗的斗志是最多的。所以我的第一条建议是环境搭建留足时间按照版本表一次配齐。第二条经验是想清楚再动手。项目启动前先画数据流图标注清楚每张表在哪个层级、由哪个组件写入、被哪个模块读取。画完这张图再写代码你会发现每天都有明确的方向感不会被零碎的报错信息带偏。第三条经验是关于进度的。这种毕业设计内容多、链路长每周给自己定一个验收点这周跑通Hadoop集群下周打通Spark和Hive再下周完成清洗入库然后才是算法和可视化。用小步快跑的方式推进每一个小里程碑都能及时发现问题而不是最后一个月爆出几十个坑。最后想说如果你想让推荐结果“有点东西”别只依赖现成算法认真看数据结构、思考用户行为的含义这个项目才真正变成你自己的作品而不只是从网上下载一套能跑的代码。
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

◈

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

◐

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

▲

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。