RDD编程中级实践,RDD算子简单计算

本文介绍了如何在Spark3.4.0环境下,利用Python3.8.10对招聘岗位数据进行预处理,包括计算每个地区的平均最高薪酬、最低薪酬和岗位数,以及北京地区的平均最高薪酬。通过RDD操作展示了如何实现数据处理和结果打印。
摘要由CSDN通过智能技术生成

一、实验目的

(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”

就可以得到结果了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值