spark分布式大数据计算3一RDD基本操作

https://blog.csdn.net/FlySky1991/article/details/79556131

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

一、创建RDD

在PySpark中,有两种方式可以创建RDD,一种是用.parallelize()集合(数组[],或者tuple())创建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条数据。输出结果如下图所示:
在这里插入图片描述

二、RDD基础操作

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

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

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值