「这是我参与11月更文挑战的第12天,活动详情查看:2021最后一次更文挑战」
1 RDD的Transformation算子操作
值类型的相关的操作: 数据类型只有value 或者说算子只对value对处理
-
map算子:
- 作用: 将每一个数据, 根据自定义函数转换为另一个数据的操作
- 一对一转换操作
rdd = sc.parallelize(range(10))
需求: 请将 0-9的列表数据, 每一个数据都新增+1操作
rdd = sc.parallelize(range(10)) # 初始化了 0~9的列表数据集
rdd2 = rdd.map(lambda num: num+1)
rdd2.collect()
结果为:
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
-
groupBy 算子
- 作用: 用于执行分组操作, 根据定义规则, 对数据进行分组操作
- 特点: 根据规则进行分组操作, 返回一个kv类型的数据, key 表示组名字 value 组内的数据
rdd = sc.parallelize(range(10))
需求: 请将 0-9的列表数据,将其中 偶数分为一组 奇数分为一组
rdd = sc.parallelize(range(10)) # 初始化了 0~9的列表数据集
rdd2= rdd.groupBy(lambda num: 'o' if(num%2 == 0) else 'j' )
rdd2.collect()
[('o', <pyspark.resultiterable.ResultIterable object at 0x7fd7faa41940>), ('j', <pyspark.resultiterable.ResultIterable object at 0x7fd7fab88fd0>)]
>>> rdd2.mapValues(list).collect()
[('o', [0, 2, 4, 6, 8]), ('j', [1, 3, 5, 7, 9])]
-
mapValues算子:
- 作用: 对key value中value数据执行map操作, 对其一对一转换操作
-
filter算子:
- 作用: 执行过滤操作, 将符合条数据留下, 不符合的过滤掉
rdd = sc.parallelize(range(10))
需求: 请将 0-9的列表数据, 请将 >5的数据过滤掉
rdd = sc.parallelize(range(10)) # 初始化了 0~9的列表数据集
rdd2 = rdd.filter(lambda num: num > 5)
rdd2.collect()
结果:
[6, 7, 8, 9]
-
flatmap算子:
- 作用: 先执行map操作, 然后将每个map结果数据合并为一个更大列表(扁平化)
需求: 将 姓名信息 进行切分, 然后将其所有姓名放置在一个列表中, 一个姓名就是一个列表元素
希望结果为: ["张三,老张,老王,老李,李四,周八,李九,王五,赵六,田七"]
rdd = sc.parallelize(["张三 老张 老王 老李","李四 周八 李九","王五 赵六 田七"])
rdd2 = rdd.flatMap(lambda names: names.split(" "))
rdd2.collect()
结果为:
['张三', '老张', '老王', '老李', '李四', '周八', '李九', '王五', '赵六', '田七']
双值类型的转换算子: 指的是将两个值类型的RDD数据合并为一个RDD过程
-
union 和 intersection
- union: 计算并集
- intersection: 计算交集
rdd1 = sc.parallelize([1,2,3,4,5])
rdd2 = sc.parallelize([6,7,3,4,9])
分别计算其交集和并集:
rdd3 = rdd1.union(rdd2)
rdd4 = rdd1.intersection(rdd2)
rdd3.collect()
结果:
[1, 2, 3, 4, 5, 6, 7, 3, 4, 9]
rdd4.collect()
结果
[3, 4]
key-value类型的转换算子:
-
groupbykey:
- 作用: 根据 key进行分组操作, 将相同key的value数据进行合并形成一个列表
rdd = sc.parallelize([('c01','张三'), ('c02','老张'), ('c01','老王'), ('c03','老李'), ('c02','李四'), ('c02','周八'), ('c04','李九'), ('c03','王五'), ('c02','赵六'), ('c03','田七')])
需求; 根据key分组, 求出每个班级人员
rdd2 = rdd.groupByKey()
rdd2.mapValues(list).collect()
结果:
[('c01', ['张三', '老王']), ('c02', ['老张', '李四', '周八', '赵六']), ('c03', ['老李', '王五', '田七']), ('c04', ['李九'])]
-
reduceByKey() 算子:
- 作用: 根据key进行分组, 然后根据给定函数进行聚合统计操作
rdd = sc.parallelize([('c01','张三'), ('c02','老张'), ('c01','老王'), ('c03','老李'), ('c02','李四'), ('c02','周八'), ('c04','李九'), ('c03','王五'), ('c02','赵六'), ('c03','田七')])
需求; 根据key分组, 求出每个班级有多少个人
rdd2 = rdd.map(lambda x:(x[0],1)).reduceByKey(lambda agg,curr : agg+curr)
rdd2.collect()
结果:
[('c01', 2), ('c02', 4), ('c03', 3), ('c04', 1)]
-
sortByKey算子:
- 作用: 根据 key进行排序操作, 默认是升序排序
需求: 假设有一下数据, 请按照key进行倒序排序
rdd = sc.parallelize([(2,'c01'), (4,'c02'), (3,'c03'), (1,'c04')])
-
countByValue算子(了解):
- 作用: 统计每个value出现了多少次
rdd = sc.parallelize([1,2,3,1,2,2,1,4,5,2,3])
rdd.countByValue()
defaultdict(<class 'int'>, {1: 3, 2: 4, 3: 2, 4: 1, 5: 1})
\