PySpark学习笔记(2)——RDD基本操作

RDD(弹性分布式数据集)是一组不可变的JVM对象的分布集,这些对象允许作业非常快速地执行计算,是Apache Spark的核心。本文主要结合简单的例子介绍下RDD的基本操作。

1.创建一个简单的RDD

在PySpark中,有两种方式可以创建RDD,一种是用.parallelize()集合(元素list或array)创建RDD,另一种是通过引用位于本地或外部的某个文件(支持.txt、.csv、parquet、JSON、Hive tables等文件类型)来创建RDD。下面以.parallelize()集合为例,创建一个简单的RDD:

%pyspark

firstRDD = sc.parallelize(
    [('sfs',27),('hk',26),('czp',25),('hdc',28),('wml',27)])

#从RDD中取3条数据
firstRDD.take(3)

上面一段代码首先创建了一个简单的RDD对象,然后用.take()方法取出其中的前3条数据。输出结果如下图所示:


2.RDD基本操作

RDD主要有两组操作:转换操作(transformation,返回指向新RDD的指针)和行动操作(action,在运行计算后向驱动程序返回值)。RDD的运算是惰性的,当RDD执行转换操作时,实际的计算并没有被执行。只有当RDD执行行动操作时,才会提交计算任务,执行相应的计算操作。其中,转化操作只是将一个RDD转化成另一个RDD,行动操作执行实际的计算

2.1 转换操作

转化操作主要是对数据集进行调整,包括映射筛选连接转换数据集中的值。在PySpark中,常见的转换方法主要有.map().filter().flatMap().distinct().sample().leftOuterJoin().repartition()等。

(1).map()转换

该方法应用于每个RDD元素上,也可以实现RDD中特定某一行或某一列元素的转变。示例代码如下所示:

#1.map操作(将RDD中数字加10后输出)
firstRDD.map(lambda x:x[1]+10).take(5)

输出结果如下所示:


(2).filter()转换

该方法可以以特定的条件或标准从数据集中选择元素。示例代码如下所示:

#2.filter操作(筛选出数字为27的记录)
firstRDD.filter(lambda x:x[1] == 27).take(5)

输出结果如下所示:


(3).flatMap()转换

该方法和.map()方法有点类似,但其返回的不是一个列表,而是一个扁平的结果。示例代码如下所示:

#3.flatMap操作(对每条记录的数字执行+2操作)
firstRDD.flatMap(lambda x:(x[0],x[1]+2)).collect()

输出结果如下所示:


(4).distinct()转换

该方法可以返回指定列中不同值的列表。可以用来验证数据集中是否出现了异常值,如可以验证性别列表中是否只包含男性和女性。示例代码如下所示:

#4.distinct操作(输出数字列中不同的值)
firstRDD.map(lambda x:x[1]).distinct().collect()

输出结果如下所示:


(5).sample()转换

该方法返回数据集中的随机样本,可以通过调整函数的参数设置随机采用的比例。示例代码如下所示:

#5.sample操作(通过调整参数来设置采样比例 )
firstRDD.sample(False,0.6,666).collect()

输出结果如下所示:


(6).leftOuterJoin()转换

该方法根据两个数据集中都有的值来连接两个RDD,并返回左侧的RDD记录。示例代码如下所示:

rdd1 = sc.parallelize(
    [('a',2),('b',6),('c',5),('d',8),('e',7)])

rdd2 = sc.parallelize(
    [('a',10),('b',20),('c',30),('d',40)])

rdd3 = rdd1.leftOuterJoin(rdd2)
rdd3.collect()

输出结果如下所示:


(7).repartition()转换

该方法重新对数据集进行分区,改变了数据集分区的数量。示例代码如下所示:

#7.repartition操作(重新对数据集进行分区,改变了数据集分区的数量)
rdd4 = rdd1.repartition(4)
#使用.glom()方法返回分区数
len(rdd4.glom().collect())

2.2 行动操作

行动操作执行数据集上的计划任务,一旦完成转换,即可执行对应的行动操作。在PySpark中,常见的行动操作有.take().collect().reduce().count().saveAsTextFile().foreach()等。

(1).take()操作

该方法返回单个数据区的前n行。类似的操作还有takeSample()first()top()等。示例代码如下所示:

#1.take操作
rdd1 = sc.parallelize(
    [('a',2),('b',6),('c',5),('d',8),('e',7)])
print('取4个数:{}'.format(rdd1.take(4)))
print('随机取2个数:{}'.format(rdd1.takeSample(False,2,666)))
print('取第1个数:{}'.format(rdd1.first()))
print('取前3个数:{}'.format(rdd1.top(3)))

输出结果如下所示:


(2).collect()操作

和.take()操作相比,该方法将所有的RDD元素返回给驱动程序

(3).reduce()操作

该方法使用指定的方法减少RDD中的元素。示例代码如下所示:

#3.reduce操作(使用reduce对RDD中的数字元素执行求和操作)
firstRDD.map(lambda x:x[1]).reduce(lambda x,y:x+y)

输出结果为:


(4).count()操作

该方法统计出了RDD中元素的数量。示例代码如下所示:

#4.count操作
firstRDD.count()

输出结果为:


(5).saveAsTextFile()操作

该方法可以将RDD保存为文本文件。示例代码如下所示:

#5.saveAsTextFile操作
firstRDD.saveAsTextFile('/zch/spark_test/data/firstRDD.txt')

(6).foreach()操作

该方法以逐一对每一条记录应用一个事先定义好的函数



猜你喜欢

转载自blog.csdn.net/FlySky1991/article/details/79556131