Spark之Transformations算子(二)

继上次介绍了Spark部分算子之后,本文继续介绍余下的Transformations算子。

(11)reduceByKey

Spark之Transformations算子(二)_第1张图片

必须注意,这里操作的也是key-value类型的RDD,专用名叫做pair RDD,本算子会要求传入一个函数,对于value进行计算,这时候,我们可以通过增加分区的个数来提高并行度。


对于Transformations算子,因为每一步不产生结果,只好用foreach的方法来输出结果,大家可以看到,这里通过偏函数(_+_),把first对应的所有value拼接在一起;输出,就得到了第二个效果。

(12)sortByKey


注意,这里操作的也是pair RDD,方法名就看得出来,因为需要有key,所以肯定是key-value类型的数据,本方法会按照指定的key的排序方式,对这一组数据进行排序。


注意,操作的时候,foreach输出可能不是真正有序的效果,所以我这里把partitions数量指定为1,因为每个partition之间的操作是并发的,这里只定义一个分区,就产生了有序的输出效果。


false的时候,是降序;true的时候,key按照升序进行排列。

(13)repartition


从字面上来看,就是重分区的意思,把给定的RDD随机的按照重新给出的分区数目重新组合,均衡的分配;这一步操作,通常都会通过网络来把数据打乱;为什么这么说呢?因为多个分区是分布在多个机器上的,如果想要把其中的数据换个地方安方,肯定要通过网络的

(14)cartesian


从官方介绍来看,其实现的目标是对于给定的两个rdd,注意,是两个数组类型的rdd,返回一个key-value类型的数据集,给上代码,更好看出来:


我们这里定义了两个组,然后重新分区,把所有的数据都放在了一个分区里,然后输出,结果如下:

Spark之Transformations算子(二)_第2张图片

可以看出,最终产生元素个数为a中元素的个数 * b中元素的个数,很好理解,就是随机的key-value组合。

(15)cogroup


字面上来看,就是联合分组,对于给定的两个数据集,返回一个新的数据集,而数据集中会把相同的key聚合在一起,而且数据集中的每个元素,都是一个元组;这个元组包含了什么呢,是两个迭代器,迭代的,就是两个数据集中分别出现的K对应的Value值。

展示一下大致的效果,输出结果如下:

问题来了,代码具体做了什么呢,对于a来说,有一个对于first字符串的迭代器,形如(“first”,<1>),在b中,同样有个对于first字符串的迭代器,形如(“first”,<1>);通过这个函数,合并一下,生成的元组就是(“first”,(<1>,<1>));进行简单的sum操作,得到了如上的结果。

(16)coalesce


也是指定分区,本操作针对的是大数据集突然变成了小数据集进行的操作,假如说一万个数据,过滤后还剩下十个,原本划分了一百个分区,现在依旧是一百个分区明显不合适,我们就可以通过该方法降为一个分区,提高效率。

言下之意,有点类似于把那些用不上的分区解除占用的味道。

(17)join


认真说下这个join操作,与数据库中的join操作其实是差不多的,实现的目的也是一样的,下面来点代码看看:


输出结果形如:


所以,对于join算子,是把两个key-value形式的数据集,找出其中key相同的数据集,把对应的value整合成一个元组的。

那么,leftOuterJoin和RightOuterJoin呢,还是例子说话:



简单分析,对于leftOuterJoin,主要是以左边的数据集为准,即便是右边没有一样的元素,也会把key放到返回的数据集中,而rightOuterJoin,则是以右边的数据集为准。

哦,还有一个,fullOuterJoin。



与Join相比,更像是一个交集和一个并集之间的关系。

(18)aggregateByKey

Spark之Transformations算子(二)_第3张图片

从官网上的介绍来看,其本身同样是个操作pairRdd的算子,我们给其指定合并的函数,实现其功能,这个东西不好说,直接上代码来解释吧。


两行代码足以解释,最终结果是57!

为什么是57呢,看看我们再这行代码中做了什么,数据分为两个分区,在分区中进行的都是相加操作;其实质就是,现在各自分区中进行相加操作,等操作完成之后,在于初始值,也就是前面括号中的4再次进行相加操作;就是说,两个分区各自都加了一个4;最后呢,因为我们要求取的是最终的和,所以两个分区合并的时候,再度使用了4,一共多了三个4,所以结果是57.

验证下,如果加10,四个分区,那是不是应该是95?


perfect,结果就是如此,该算子给我们提供了一个先对分区各自进行操作,然后再对所有分区各自整合出的结果,再度进行操作的一个方式。

(19)pipe


算子用的比较少,就不加叙述了

(20)repartitionAndSortWithinPartitions

Spark之Transformations算子(二)_第4张图片

这个算子用来做什么的呢,我用的比较少,字面意思上来说,功能类似于repartition,就是用于分区重新分配的,但是,这里可以自己指定partitioner,从而使得整个重新分配更加符合我们的业务需求。

你可能感兴趣的:(Spark)