102-基于Spark的招聘数据预测分析推荐系统

发布于:2025-08-11 ⋅ 阅读:(16) ⋅ 点赞:(0)

基于Spark的招聘数据分析预测推荐系统

📋 项目概述

本项目是一个基于大数据技术的招聘数据分析与推荐系统,集成了数据采集、清洗、分析、可视化和智能推荐等功能。系统采用分布式计算框架Spark进行大规模数据处理,结合机器学习算法实现职位薪资预测和个性化推荐,为求职者和企业提供数据驱动的招聘决策支持。

🏗️ 系统架构

技术栈

后端技术
  • Web框架: Django 3.1.14
  • 数据库: MySQL + Hive
  • 大数据处理: Apache Spark (PySpark)
  • 机器学习: TensorFlow 2.13.0, scikit-learn 1.3.2
  • 数据处理: pandas 1.4.3, numpy 1.23.1
  • 自然语言处理: jieba 0.42.1, snownlp 0.12.3
前端技术
  • 模板引擎: Django Templates
  • 数据可视化: ECharts, ApexCharts, Chart.js
  • UI框架: Bootstrap
  • 图表库: wordcloud 1.8.2.2
数据采集
  • 爬虫框架: Selenium WebDriver
  • 浏览器驱动: ChromeDriver
  • 数据存储: CSV, MySQL

项目演示

项目源码获取,码界筑梦坊,各大平台同名,欢迎咨询哔哩哔哩个人主页~
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

📁 项目结构

基于Spark的招聘数据分析预测推荐系统/
├── myApp/                    # Django应用主目录
│   ├── templates/            # 前端模板
│   ├── models.py            # 数据模型
│   ├── views.py             # 视图控制器
│   └── urls.py              # URL路由
├── spiders/                  # 数据采集模块
│   ├── spider.py            # 爬虫主程序
│   └── jobData.csv          # 原始数据
├── spark/                    # Spark数据分析
│   ├── sparkAna.py          # 数据分析脚本
│   └── sparkFir.py          # Spark初始化
├── recommend/                # 推荐系统
│   └── goRecommend.py       # 协同过滤推荐
├── predict/                  # 薪资预测
│   └── goPredict.py         # 深度学习预测
├── utils/                    # 工具函数
│   ├── getChartData.py      # 图表数据获取
│   ├── getPublicData.py     # 公共数据接口
│   └── queryhive.py         # Hive查询
└── static/                   # 静态资源
    ├── css/                 # 样式文件
    ├── js/                  # JavaScript库
    └── images/              # 图片资源

🔧 核心功能实现

1. 数据采集模块

爬虫实现
class spider(object):
    def __init__(self, type, city, page):
        self.type = type
        self.city = city
        self.page = page
        self.spiderUrl = 'https://www.lagou.com/wn/jobs?fromSearch=true&kd=%s&city=%s&pn=%s'

    def startBrowser(self):
        service = Service('./chromedriver.exe')
        option = webdriver.ChromeOptions()
        option.debugger_address = 'localhost:9222'
        browser = webdriver.Chrome(service=service, options=option)
        return browser

    def main(self, page):
        browser = self.startBrowser()
        browser.get(self.spiderUrl % (self.type, self.city, self.page))
        
        job_list = browser.find_elements(by=By.XPATH, 
                                       value='//div[@id="jobList"]/div[@class="list__YibNq"]/div[@class="item__10RTO"]')
        
        for job in job_list:
            # 提取职位信息
            title = job.find_element(by=By.XPATH, value='.//div[@class="p-top__1F7CL"]/a').text
            companyTitle = job.find_element(by=By.XPATH, value='.//div[@class="company-name__2-SjF"]/a').text
            salary = job.find_element(by=By.XPATH, value='.//div[@class="p-bom__JlNur"]/span').text
            
            # 数据清洗和标准化
            salary = re.findall('\d+', salary)
            minSalary = int(salary[0]) * 1000
            maxSalary = int(salary[1]) * 1000
            
            # 保存到CSV
            self.save_to_csv([self.type, title, companyTitle, minSalary, maxSalary, 
                            workExperience, education, totalTag, companyPeople, 
                            workTag, welfare, imgSrc, self.city])

技术特点:

  • 使用Selenium WebDriver实现动态页面爬取
  • 支持多城市、多职位类型批量采集
  • 数据实时清洗和标准化处理
  • 异常处理和重试机制

2. 大数据分析模块

Spark数据分析
# 构建Spark会话
spark = SparkSession.builder.appName("sparkSQL").master("local[*]").\
    config("spark.sql.shuffle.partitions", 2).\
    config("spark.sql.warehouse.dir", "hdfs://node1:8020/user/hive/warehouse").\
    config("hive.metastore.uris", "thrift://node1:9083").\
    enableHiveSupport().\
    getOrCreate()

# 城市平均工资分析
top_city = jobData.groupby("city")\
    .agg(avg("maxSalary").alias("avg_max_salary"))\
    .orderBy(desc("avg_max_salary"))

# 薪资区间分布
jobData_classfiy = jobData.withColumn("salary_category",
    when(col("maxSalary").between(0, 5000), "0-5k")
    .when(col("maxSalary").between(5000, 7000), "5k-7k")
    .when(col("maxSalary").between(7000, 10000), "7k-10k")
    .when(col("maxSalary").between(10000, 20000), "10-20k")
    .when(col("maxSalary") > 20000, "20k以上")
    .otherwise("未分类"))

# 工作经验与薪资关系
result3 = jobData.groupby("workExperience")\
    .agg(avg("maxSalary").alias("avg_max_salary"),
         avg("minSalary").alias("avg_min_salary"))\
    .orderBy("workExperience")

分析维度:

  • 城市薪资排名分析
  • 薪资区间分布统计
  • 工作经验与薪资关系
  • 城市职位分布热力图
  • 行业薪资对比分析

3. 机器学习预测模块

薪资预测模型
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import LabelEncoder
import tensorflow as tf

# 数据预处理
X = data[['city', 'workExperience', 'education']]
y = data['maxSalary'].astype(float)

# 标签编码
label_encodes = {}
for column in X.columns:
    le = LabelEncoder()
    X[column] = le.fit_transform(X[column])
    label_encodes[column] = le

# 构建神经网络模型
model = tf.keras.Sequential([
    tf.keras.layers.Dense(64, activation='relu', input_shape=(X_train.shape[1],)),
    tf.keras.layers.Dense(64, activation='relu'),
    tf.keras.layers.Dense(1)
])
model.compile(optimizer='adam', loss='mean_squared_error')

# 预测函数
def pred_salary(city, workExp, education):
    input_data = pd.DataFrame([[city, workExp, education]], 
                             columns=['city', 'workExperience', 'education'])
    
    for column in input_data.columns:
        input_data[column] = label_encodes[column].transform(input_data[column])
    
    prediction = model.predict(input_data)
    return prediction[0][0]

模型特点:

  • 基于深度学习的薪资预测
  • 多特征输入(城市、经验、学历)
  • 自动特征编码和标准化
  • 模型训练和验证分离

4. 推荐系统模块

协同过滤推荐
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.metrics.pairwise import cosine_similarity

# TF-IDF特征提取
tfidf = TfidfVectorizer()
tfidf_matrix = tfidf.fit_transform(data['title'])

# 计算相似度矩阵
cosine_sim = cosine_similarity(tfidf_matrix, tfidf_matrix)

# 推荐函数
def get_recommendations(title, cosine_sim=cosine_sim):
    idx = data[data['title'] == title].index[0]
    
    # 获取相似职位
    sim_scores = list(enumerate(cosine_sim[idx]))
    sim_scores = sorted(sim_scores, key=lambda x: x[1], reverse=True)
    
    # 返回推荐结果
    similar_titles = [(data.iloc[i]['title'], i) for i, _ in sim_scores[1:]]
    return similar_titles

推荐算法:

  • 基于TF-IDF的文本相似度计算
  • 余弦相似度度量
  • 职位标题特征提取
  • 个性化推荐排序

5. 数据可视化模块

Django视图实现
def home(request):
    if request.method == 'GET':
        # 获取各类统计数据
        averageCityX, averageCityY, salarycategoryData, expSalaryX, expSalaryY1, expSalaryY2, peoplecategoryData, adddresssumData = getIndexData()
        sorted_arr = list(getsalaryTop())
        
        return render(request, 'home.html', {
            'averageCityX': averageCityX,
            'averageCityY': averageCityY,
            'salarycategoryData': salarycategoryData,
            'expSalaryX': expSalaryX,
            'expSalaryY1': expSalaryY1,
            'expSalaryY2': expSalaryY2,
            'peoplecategoryData': peoplecategoryData,
            'adddresssumData': adddresssumData,
            'sorted_arr': sorted_arr
        })

def salaryChar(request):
    # 薪资分析图表
    typeSalaryList = list(gettypeSalary())
    typeSalaryX = [x[0] for x in typeSalaryList]
    typeSalaryY1 = list(typeSalaryList[0][1:])
    typeSalaryY2 = list(typeSalaryList[1][1:])
    typeSalaryY3 = list(typeSalaryList[2][1:])

可视化功能:

  • 城市薪资分布柱状图
  • 薪资区间饼图
  • 工作经验薪资趋势线图
  • 城市职位分布地图
  • 行业分析雷达图
  • 词云展示

📊 数据模型设计

用户模型

class User(models.Model):
    id = models.AutoField("id", primary_key=True)
    username = models.CharField("username", max_length=255, default='')
    password = models.CharField("password", max_length=255, default='')
    createTime = models.DateField("创建时间", auto_now_add=True)

    class Meta:
        db_table = "user"

class History(models.Model):
    id = models.AutoField("id", primary_key=True)
    jobId = models.CharField("职位ID", max_length=255, default='')
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    count = models.IntegerField("收藏次数", default=1)

    class Meta:
        db_table = "history"

职位数据结构

type,title,companyTitle,minSalary,maxSalary,workExperience,education,totalTag,companyPeople,workTag,welfare,imgSrc,city

🎯 系统功能清单

用户管理

  • ✅ 用户注册与登录
  • ✅ 会话管理与安全控制
  • ✅ 个人信息管理

数据采集

  • ✅ 自动化职位数据爬取
  • ✅ 多城市、多职位类型采集
  • ✅ 数据清洗与标准化
  • ✅ 实时数据更新

数据分析

  • ✅ 城市薪资排名分析
  • ✅ 薪资区间分布统计
  • ✅ 工作经验薪资关系
  • ✅ 城市职位分布热力图
  • ✅ 行业薪资对比分析
  • ✅ 学历要求统计

数据可视化

  • ✅ 交互式图表展示
  • ✅ 多维度数据对比
  • ✅ 实时数据更新
  • ✅ 响应式设计

智能推荐

  • ✅ 基于内容的推荐
  • ✅ 协同过滤算法
  • ✅ 个性化推荐排序
  • ✅ 推荐结果展示

薪资预测

  • ✅ 深度学习模型
  • ✅ 多特征输入预测
  • ✅ 预测结果可视化
  • ✅ 模型性能评估

🚀 部署与运行

环境要求

  • Python 3.8+
  • Apache Spark 3.0+
  • MySQL 8.0+
  • Hive 3.0+
  • Chrome浏览器 + ChromeDriver

安装依赖

pip install -r requirements.txt

数据库配置

# settings.py
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'bigdata',
        'USER': 'root',
        'PASSWORD': 'root',
        'HOST': 'localhost',
        'PORT': '3306',
    }
}

启动服务

# 启动Django服务
python manage.py runserver

# 运行Spark分析
python spark/sparkAna.py

# 启动爬虫
python spiders/spider.py

📈 性能优化

数据处理优化

  • 使用Spark分布式计算提升大数据处理性能
  • 数据分区和缓存策略
  • 并行计算优化

数据库优化

  • 索引优化
  • 查询语句优化
  • 连接池配置

前端优化

  • 静态资源压缩
  • CDN加速
  • 懒加载实现

🔮 未来扩展

功能扩展

  • 实时数据流处理
  • 更多机器学习算法集成
  • 移动端适配
  • API接口开放

技术升级

  • 微服务架构改造
  • 容器化部署
  • 云原生架构
  • 实时推荐系统

📝 总结

本项目成功构建了一个基于Spark的招聘数据分析预测推荐系统,实现了从数据采集到智能推荐的完整闭环。系统采用现代化的技术栈,结合大数据处理和机器学习技术,为招聘市场提供了数据驱动的决策支持。

项目亮点:

  1. 技术栈全面: 涵盖Web开发、大数据处理、机器学习、数据可视化
  2. 架构合理: 模块化设计,便于维护和扩展
  3. 功能完整: 从数据采集到智能推荐的全流程实现
  4. 性能优化: 分布式计算提升处理效率
  5. 用户体验: 直观的可视化界面和个性化推荐

应用价值:

  • 为求职者提供薪资参考和职位推荐
  • 为企业提供市场分析和人才需求预测
  • 为招聘平台提供数据驱动的运营支持

联系方式: [码界筑梦坊 各平台同名]


标签: #大数据 #Spark #机器学习 #Django #数据可视化 #推荐系统 #招聘分析