目录
(3)transformation算子——flatMap()
(6)transformation算子——intersection()
(7)transformation算子——distinct()
(19)PariRDD算子(transformation算子)——mapValues和flatMapValues()
(20)PariRDD算子(transformation算子)——reduceByKey()
(21)PariRDD算子(transformation算子)——groupByKey()
(22)PariRDD算子(transformation算子)——sortByKey()
(23)PariRDD算子(action算子)——collectAsMap()
(24)PariRDD算子(action算子)——countByKey()
一、spark RDD
(1)RDD简介
RDD(Resilient Distributed Datasets),弹性分布式数据集,是分布式内存的一个抽象概念。RDD提供了一种高度受限的共享内存模型,即RDD是只读的记录分区的集合,只能通过在其他RDD执行确定的转换操作(如map、join和group by)而创建,然而这些限制使得实现容错的开销很低。RDD具备像MapReduce等数据流模型的容错特性,并且允许开发人员在大型集群上执行基于内存的计算。RDD是只读的、分区记录的集合。RDD只能基于在稳定物理存储中的数据集和其他已有的RDD上执行确定性操作来创建。
(2)算子简介
作用于RDD上的Operation分为转换(transformantion)和动作(action)。 Spark中的所有“转换”都是惰性的,当执行“转换”操作时,并不会提交Job,只有在执行“动作”操作,所有operation才会被真正的被执行。这样可以大大提升系统的性能。用一个图片展示如下:
Spark为包含键值对(key-value)类型的RDD提供了一些专有的操作,这些RDD被称PairRDD。
二、RDD的使用(基于Linux系统)
(1)RDD创建
RDD有两种创建方法,分别是:基于数据集合构建、基于外部数据源创建。
①基于数据集合创建
自定义数据集合进行RDD转换(parallelize()函数),通过显示命令collect()显示出rdd样式。
#自定义数据集合
data=[1,2,3,4,5,6,7,8,9]
#创建RDD
rdd=sc.parallelize(data)
#显示rdd,使用collcet()函数
rdd.collect()
②基于外部数据源创建
使用textFile()函数进行进行文件读入,函数内加入的是文件在虚拟机中的绝对路径。
rdd = sc.textFile("file:///root/data/apache.log")
rdd.collect()
(2)transformation算子——map()
map算子将原来RDD的每个数据项通过map中的用户自定义函数f映射转变为一个新的元素,从而
形成新的RDD。简单的来说就是根据map()括号中定义的函数进行映射有点儿类似于遍历的一个过程。而mapPartitions的输入函数是应用于每个分区。mapPartitionsWithIndex:对RDD中的每个分区(带有下标)进行操作,通过自己定义的一个函数来处理。
下面通过例子讲述就会很清晰的讲述出map()函数的作用过程。
#转换成RDD形式
rdd = sc.parallelize(["this is a demo","hello world"])
#进行转换显示
rdd.collect()
#进行map()操作
rdd.map(lambda x : x.split(" ")).collect()
结果如图,map()中添加的函数我们选用split()分割函数,不难看出,他先对集合中的两个元素进行遍历,在对没个遍历了的函数进行split()分割,所以博主觉得这个map和Python的map很像。
(3)transformation算子——flatMap()
flatMap算子首先将map函数应用于该RDD的所有元素,然后将结果平坦化,从而返回新的RDD。
简单的说就是对数据进行一次遍历后执行括号内的函数再进行一次遍历。
rdd = sc.parallelize(["this is a demo","hello world"])
rdd.flatMap(lambda x : x.split(" ")).collect()
得到如下结果,因为这儿rdd的性质和pandas的性质不一样,它是不变的,前面也做过说明,因此博主直接盗用前面的rdd。结果显而易见是对map做了一个集合的遍历添加操作。
(4)transformation算子——filter()
filter算子会针对 RDD所有分区的每一个元素进行过滤,满足条件的返回,不满足条件的忽略。在Python编程中这个算子实现方法为遍历判断,添加在集合中输出。
rdd = sc.parallelize([1, 2, 3, 4, 5])
rdd.filter(lambda x: x % 2 == 0).collect()
结果如图所示,过滤出符合条件的数据。
(5)transformation算子——union()
可以求两个RDD的并集,返回一个新的RDD,union函数有点雷同与SQL语句的union只是SQL语句中两表数据的连接有一定的限制,而spark中就是求一个并集。
rdd1 = sc.parallelize([1,9,2,3])
rdd2 = sc.parallelize([4,5,6,7])
rdd1.union(rdd2).collect()
得到如下结果: