RDD算子介绍

本文详细介绍了Spark中的RDD算子,包括转换算子和动作算子。转换算子如map、groupBy、filter、flatMap等,它们是惰性的,只有遇到动作算子如collect、reduce、first、take等时才会触发执行。文章还提到了RDD的重要算子如partitionBy、repartition、coalesce等,以及聚合算子reduce、fold和aggregate,以及不同类型的关联操作join、leftOuterJoin、rightOuterJoin和fullOuterJoin。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

一.RDD的相关算子

二.RDD算子的分类

三.RDD的转换算子

3.1 (单)值类型算子

3.2 双值类型算子

3.3 key-value数据类型算子

四.RDD的动作算子

五.RDD的重要算子

5.1 基本算子

5.2 分区算子

5.3 重分区算子

5.4 聚合算子

5.5关联算子


一.RDD的相关算子

RDD算子: 指的是RDD对象中提供了非常多的具有特殊功能的函数, 我们将这些函数称为算子 (大白话:指的RDD的API)

相关的算子的官方文档: Spark Core — PySpark 3.1.2 documentation

二.RDD算子的分类

整个RDD算子, 共分为两大类:Transformation转换算子和Action动作算子

Transformation转换算子:
    1- 所有的转换算子在执行完成后,都会返回一个新的RDD
    2- 所有的转换算子都是【Lazy惰性】,并不会立即执行,仅仅是在定义计算的规则
    3- 转换算子必须遇到【Action动作算子】才会触发执行

Action动作算子:
    1- 动作算子在执行后,不会返回一个RDD。【要么没有返回值,要么返回的数据类型不是RDD】
    2- 动作算子都是【立即执行】的,一个动作算子就会产生一个Job的任务,并且会执行这个动作算子所依赖的其他所有RDD

相关的转换算子

相关的动作算子:

三.RDD的转换算子

3.1 (单)值类型算子

  • map算子:

    • 格式: rdd.map(fn)

    • 说明: 主要根据传入的函数,对数据进行一对一的转换操作,传入一行,返回一行

输入: init_rdd = sc.parallelize([0,1,2,3,4,5,6,7,8,9])
需求: 数字加一后返回
代码: init_rdd.map(lambda num:num+1).collect()
结果: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

  • groupBy 算子:

    • 格式: rdd.groupBy(fn)

    • 说明: 根据传入的函数对数据进行分组操作

输入: init_rdd = sc.parallelize([0,1,2,3,4,5,6,7,8,9])
需求: 将数据分成奇数和偶数
代码: init_rdd.groupBy(lambda num:'o' if num%2==0 else 'j').mapValues(list).collect()
结果: [('j', [1, 3, 5, 7, 9]), ('o', [0, 2, 4, 6, 8])]
总结: mapValues(list)将kv数据类型中value转换成列表

  • filter算子:

    • 格式:rdd.filter(fn)

    • 说明:过滤算子,可以根据函数中指定的过滤条件,对数据进行过滤操作,条件返回True表示保留,返回False 表示过滤

输入: init_rdd = sc.parallelize([0,1,2,3,4,5,6,7,8,9])
需求: 过滤掉数值<=3的数据
代码: init_rdd.filter(lambda num:num>3).collect()
结果: [4, 5, 6, 7, 8, 9]

  • flatMap算子:

    • 格式:rdd.flatMap(fn)

    • 说明:在map算子的基础上,加入一个压扁的操作, 主要适用于一行中包含多个内容的操作,实现一转多的操作

输入: init_rdd = sc.parallelize(['张三 李四 王五','赵六 周日'])
需求: 将姓名一个一个的输出
代码: init_rdd.flatMap(lambda content:content.split()).collect()
结果: ['张三', '李四', '王五', '赵六', '周日']

3.2 双值类型算子

  • union(并集) 和intersection(交集)

    • 格式: rdd1.union(rdd2) rdd1.intersection(rdd2)

输入: rdd1 = sc.parallelize([3,2,6,8,0])
     rdd2 = sc.parallelize([3,2,1,5,7])
​
并集: rdd1.union(rdd2).collect()
结果: [3, 2, 6, 8, 0, 3, 2, 1, 5, 7]
​
对并集的结果进行去重: rdd1.union(rdd2).distinct().collect()
结果: [8, 0, 1, 5, 2, 6, 3, 7]
​
交集: rdd1.intersection(rdd2).collect()
结果: [2, 3]

3.3 key-value数据类型算子

  • groupByKey()

    • 格式: rdd.groupByKey()

    • 说明: 根据key进行分组操作

输入: rdd = sc.parallelize([('c01','张三'),('c02','李四'),('c02','王五'),('c01','赵六'),('c03','田七'),('c03','周八'),('c02','李九')])
需求: 对学生按照班级分组统计
代码: rdd.groupByKey().mapValues(list).collect()
结果: [('c01', ['张三', '赵六']), ('c02', ['李四', '王五', '李九']), ('c03', ['田七', '周八'])]
  • reduceByKey()

    • 格式: rdd.reduceByKey(fn)

    • 说明: 根据key进行分组,将一个组内的value数据放置到一个列表中,对这个列表基于fn进行聚合计算操作

输入: rdd = sc.parallelize([('c01','张三'),('c02','李四'),('c02','王五'
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值