目录
一.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','王五'