天天看点

[大数据之Spark]——Transformations转换入门经典实例

spark相比于mapreduce的一大优势就是提供了很多的方法,可以直接使用;另一个优势就是执行速度快,这要得益于dag的调度,想要理解这个调度规则,还要理解函数之间的依赖关系。

本篇就着重描述下spark提供的transformations方法.

[大数据之Spark]——Transformations转换入门经典实例

窄依赖是指父rdd仅仅被一个子rdd所使用,子rdd的每个分区依赖于常数个父分区(o(1),与数据规模无关)。

输入输出一对一的算子,且结果rdd的分区结构不变。主要是map/flatmap

输入输出一对一的算子,但结果rdd的分区结构发生了变化,如union/coalesce

从输入中选择部分元素的算子,如filter、distinct、substract、sample

宽依赖是指父rdd被多个子分区使用,子rdd的每个分区依赖于所有的父rdd分区(o(n),与数据规模有关)

对单个rdd基于key进行重组和reduce,如groupbykey,reducebykey

对两个rdd基于key进行join和重组,如join(父rdd不是hash-partitioned )

需要进行分区,如partitionby

[大数据之Spark]——Transformations转换入门经典实例

map用于遍历rdd中的每个元素,可以针对每个元素做操作处理:

filter用于过滤元素信息,仅仅返回满足过滤条件的元素

flatmap与map相比,不同的是可以输出多个结果,比如

mappartitions与map类似,只不过每个元素都是一个分区的迭代器,因此内部可以针对分区为单位进行处理。

比如,针对每个分区做和

这个方法与上面的mappartitions相同,只不过多提供了一个index参数。

这个方法可以用于对数据进行采样,比如从1000个数据里面随机5个数据。

第一个参数withreplacement代表是否进行替换,如果选true,上面的例子中,会出现重复的数据

第二个参数fraction 表示随机的比例

第三个参数seed 表示随机的种子

union方法可以合并两个数据集,但是不会去重,仅仅合并而已。

这个方法用于取两个数据集的交集

这个方法用于对本身的数据集进行去重处理。

这个方法属于宽依赖的方法,针对所有的kv进行分组,可以把相同的k的聚合起来。如果要想计算sum等操作,最好使用reducebykey或者combinebykey

这个方法用于根据key作分组计算,但是它跟reduce不同,它还是属于transfomation的方法。

aggregatebykey比较复杂,我也不是很熟练,不过试验了下,大概的意思是针对分区内部使用seqop方法,针对最后的结果使用combop方法。

比如,想要统计分区内的最大值,然后再全部统计加和:

sortbykey用于针对key做排序,默认是按照升序排序。

join方法为(k,v)和(k,w)的数据集调用,返回相同的k,所组成的数据集。相当于sql中的按照key做连接。

举个例子

在类型为(k,v)和(k,w)的数据集上调用,返回一个 (k, (seq[v], seq[w]))元组的数据集。

这个方法用于计算两个(k,v)数据集之间的笛卡尔积

pipe方法用于针对每个分区的rdd执行一个shell脚本命令,可以使perl或者bash。分区的元素将会被当做输入,脚本的输出则被当做返回的rdd值。

这个方法用于对rdd进行重新分区,第一个参数是分区的数量,第二个参数是是否进行shuffle

这个方法作用于coalesce一样,重新对rdd进行分区,相当于shuffle版的calesce

这个方法是在分区中按照key进行排序,这种方式比先分区再sort更高效,因为相当于在shuffle阶段就进行排序。

下面的例子中,由于看不到分区里面的数据。可以通过设置分区个数为1,看到排序的效果。

继续阅读