Pyspark学习笔记(五)RDD操作(一)_RDD转换操作
前言
提示:本篇博客讲的是RDD的操作中的转换操作,即 RDD Transformations
主要参考链接:
1.PySpark RDD Transformations with examples
2.Apache spark python api
一、PySpark RDD 转换操作简介
PySpark RDD 转换操作(Transformation) 是惰性求值,用于将一个 RDD 转换/更新为另一个。
由于RDD本质上是不可变的,转换操作总是创建一个或多个新的RDD而不更新现有的RDD,因此,一系列RDD转换创建了一个RDD谱系。
1.窄操作
这些计算数据存在于单个分区上,这意味着分区之间不会有任何数据移动。
常见的执行窄操作的一般有:map()
,mapPartition()
,flatMap()
,filter()
,union()
2.宽操作
这些计算数据存在于许多分区上,这意味着分区之间将有数据移动以执行更广泛的转换。由于这些对数据进行混洗,因此它们也称为混洗转换,所以与窄操作相比,是更加昂贵的操作。
常见的执行宽操作的一些方法是:groupBy()
, groupByKey()
, join()
, repartition()
等
二.常见的转换操作表 & 使用例子
0.创建一个示例rdd, 后续的例子基本以此例展开
data_list = [ ((10,1,2,3), (10,1,2,4), (10,1,2,4), (20,2,2,2), (20,1,2,3)) ]
# 注意该列表中包含有两层tuple嵌套,相当于列表中的元素是一个 (5,4) 二维的tuple
rdd_test = spark.sparkContext.parallelize(data_list)
print("rdd_test:\n", rdd_test.collect())
则输出为:
[ ((10,1,2,3), (10,1,2,4), (10,1,2,4), (20,2,2,2), (20,1,2,3)) ]
1.map(<func>)
是所有转换操作中最基本的。
它应用一个具名函数或者匿名函数,对数据集内的所有元素执行同一操作。
pyspark.RDD.map
# the example of map
rdd_map_test = rdd_test.map(lambda x: (x[0], x[3]))
print("rdd_map_test\n", rdd_map_test.collect())
相当于只从第一层 tuple 中取出了第0和第3个 子tuple, 输出为:
[((10,1,2,3),