一、RDD概念
RDD(英文全称Resilient Distributed Dataset),即弹性分布式数据集是spark中引入的一个数据结构,是Spark中最基本的数据抽象,代表一个不可变、可分区、里面的元素可并行计算的集合。
Resilient弹性:RDD的数据可以存储在内存或者磁盘当中,RDD的数据可以分区。
Distributed分布式:RDD的数据可以分布式存储,可以进行并行计算。
Dataset数据集:一个用于存放数据的集合。
在上一篇《SparkRDD的转换与动作算子》中,介绍了SparkRDD中的一些常用算子,下面介绍RDD中的一些重要算子,是在实际是工作用的比较多,而且比较复杂的一些算子。
以下演示通过SecureCRTPortable客户端远程连接Linux服务器操作pyspark。
连接界面如下:
二、分区算子
作用:针对整个分区数据进行处理的算子。
1、mapPartitions算子
输入数据:rdd = sc.parallelize([1,2,3,4,5,6,7,8,9,10],3),先查看分区情况
>>> rdd = sc.parallelize([1,2,3,4,5,6,7,8,9,10],3)
# 查看分区
>>> rdd.glom().collect()
# 运行结果 [[1, 2, 3], [4, 5, 6], [7, 8, 9, 10]]
解释:parallelize(data,num)通过自定义列表的方式初始化RDD对象。(一般用于测试)
其中data为输入的数据,num为选择分区数。
glom() 可以将RDD以分区形式输出,查看数据在哪个分区。
getNumPartitions() 查看当前RDD有多少个分区
目前parallelize设置了3个分区,因此输出结果有3个列表。
以下通过map和mapPartitions的对比查看两个算子的区别:
需求: 对数字加一
map效果代码:
>>> rdd = sc.parallelize([1,2,3,4,5,6,7,8,9,10],3)
>>>
#自定义函数
>>> def my_add(num):
... print(f"传递进来的数据{num}")
... return num+1
...
>>> rdd.map(my_add).collect()
### 运行结果
传递进来的数据4
传递进来的数据5
传递进来的数据6
传递进来的数据1
传递进来的数据2
传递进来的数据3
传递进来的数据7
传递进来的数据8
传递进来的数据9
传递进来的数据10
[2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
总结:map被调用了10次,反复操作会导致资源消耗,浪费资源。
mapPartitions效果代码: