一、实验目的
(1)熟悉Spark的RDD基本操作及键值对操作;
(2)熟悉使用RDD编程解决实际具体问题的方法。
二、实验平台
操作系统:Ubuntu20.04
Spark版本:3.4.0
Python版本:3.8.10
三、实验内容和过程
1.实验内容
数据格式:
从左往右的列分别表示:职位编号、职位名称、薪资范围、工作区域、职位简述、工作年限、学历要求、职位详情等。请根据给定的实验数据,在pyspark中通过编程来计算以下内容:
(1)统计发布招聘岗位每个地区的平均最高薪酬和平均最低薪酬;
(2)统计每个地区的招聘岗位数;
(3)统计北京地区的平均最高薪酬;
2. 实验过程
先生成数据集,保存为txt文档。这里我是自己用chat生成的数据集,共32条,比较少,读者也可以自己生成数量较大的数据集进行实验。数据集链接:
http://链接: https://pan.baidu.com/s/1fSvHO-9avpMt2JGGTklvsg 提取码: sa9z 复制这段内容后打开百度网盘手机App,操作更方便哦
(1)读取数据
data = sc.textFile("file:///usr/local/spark/mycode/test2/work.txt") |
(2)对数据集进行预处理,将每一行数据拆分成字段,并返回一个元组(地区,最低薪酬,最高薪酬)
def preprocess(line): fields = line.split(',') return (fields[4].strip(), int(fields[2]), int(fields[3])) |
(3)RDD转换,应用预处理函数并过滤掉标题行
processed_data = data.filter(lambda x: '地区' not in x).map(preprocess) |
(4)统计发布招聘岗位每个地区的平均最高薪酬和平均最低薪酬
avg_salary = processed_data.map(lambda x: (x[0], (x[1], x[2], 1))) \ .reduceByKey(lambda x, y: (x[0] + y[0], x[1] + y[1], x[2] + y[2])) \ .mapValues(lambda x: (x[0] / x[2], x[1] / x[2])) |
(5)统计每个地区的招聘岗位数;
job_count = processed_data.map(lambda x: (x[0], 1)) \ .reduceByKey(lambda x, y: x + y) \ .collect() |
(6)统计北京地区的平均最高薪酬;
beijing_avg_salary = processed_data.filter(lambda x: x[0] == '北京') \ .map(lambda x: x[2]) \ .mean() |
(7)打印结果
print("(1)发布招聘岗位每个地区的平均最高薪酬和平均最低薪酬:") for item in avg_salary.collect(): # 使用collect()方法转换为列表 print("地区:{},平均最低薪酬:{},平均最高薪酬:{}".format(item[0], item[1][0], item[1][1])) print("\n(2)每个地区的招聘岗位数:") for item in job_count: print("地区:{},招聘岗位数:{}".format(item[0], item[1])) print("\n(3)北京地区的平均最高薪酬:", beijing_avg_salary) |
运行结果为:
(8)停止SparkContext
sc.stop() |
3. 具体操作
在虚拟机中创建一个.py文件,完整代码:
from pyspark import SparkContext
# 创建SparkContext对象
sc = SparkContext("local", "JobAnalysis")
# 读取数据
data = sc.textFile("file:///usr/local/spark/mycode/test2/work.txt")
# 数据预处理函数,将每一行数据拆分成字段,并返回一个元组(地区,最低薪酬,最高薪酬)
def preprocess(line):
fields = line.split(',')
return (fields[4].strip(), int(fields[2]), int(fields[3]))
# RDD转换:应用预处理函数并过滤掉标题行
processed_data = data.filter(lambda x: '地区' not in x).map(preprocess)
# (1)统计发布招聘岗位每个地区的平均最高薪酬和平均最低薪酬
avg_salary = processed_data.map(lambda x: (x[0], (x[1], x[2], 1))) \
.reduceByKey(lambda x, y: (x[0] + y[0], x[1] + y[1], x[2] + y[2])) \
.mapValues(lambda x: (x[0] / x[2], x[1] / x[2]))
# (2)统计每个地区的招聘岗位数
job_count = processed_data.map(lambda x: (x[0], 1)) \
.reduceByKey(lambda x, y: x + y) \
.collect()
# (3)统计北京地区的平均最高薪酬
beijing_avg_salary = processed_data.filter(lambda x: x[0] == '北京') \
.map(lambda x: x[2]) \
.mean()
# 打印结果
print("(1)发布招聘岗位每个地区的平均最高薪酬和平均最低薪酬:")
for item in avg_salary.collect(): # 使用collect()方法转换为列表
print("地区:{},平均最低薪酬:{},平均最高薪酬:{}".format(item[0], item[1][0], item[1][1]))
print("\n(2)每个地区的招聘岗位数:")
for item in job_count:
print("地区:{},招聘岗位数:{}".format(item[0], item[1]))
print("\n(3)北京地区的平均最高薪酬:", beijing_avg_salary)
# 停止SparkContext
sc.stop()
在该目录下打开终端,然后执行
“python3 work.py”
就可以得到结果了。