详细解析RDD一些聚合、归并操作的API,具体包括aggregate、reduce、fold等。
一、aggregate
1.定义
2.功能描述
aggregate函数首先用初始值(zeroValue)和seqOp操作,将每个分区里面的元素进行聚合,对聚合后每个分区会返回一个类型为U的值,然后再用combOp函数将各个分区的返回值再次进行聚合。
3.示例
本案例中U的类型为List[String],而RDD的类型T为String。
简化,去掉zeroValue的定义:
进一步简化,去掉函数的定义:
4.示例解析
其中,当Scala编译器无法进行类型推导时,则需要指定类型,比如指定U为[List[String]]。简化的代码比较难理解,可以通过API的签名,strRDD元素的类型等自己推导,以加深理解。
通过aggregate操作,最终得到类型为U的值,和初始值zeroValue的类型相同,但不需要和RDD中元素类型一致。
因此,通过aggregate操作可以得到与RDD元素类型T不同的聚合类型U。
二、reduce
1.定义
2.功能描述
使用具有交换性和关联性的二进制操作,对RDD的元素进行归并。(www.xing528.com)
3.示例
4.示例解析
需要注意的是,归并RDD数据后得到的值的类型必须是和RDD元素的类型一致。
5.应用场景
通常用于将Driver Program端的Scala数据集转换为RDD,可以用于用户自己构建的数据集,也可以针对前面RDD的返回数据集,比如collect操作返回的数组数据集等,转换为RDD后,就可以使用RDD提供的丰富的API操作进行分布式计算了。
三、fold
1.定义
2.功能描述
聚合每个分区的元素,然后使用具有关联性的操作,以及一个初始值,将每个分区聚合的结果进行归并。
给定的op(t1,t2)操作运行修改第一个参数值,并返回其结果,这可以避免对结果值的内存分配,但不应该修改第二个参数值。
3.示例
4.示例解析
fold操作时,用于归并的初始值以及操作的返回值的类型,都必须和RDD元素的类型一致。
四、fold与reduce操作的对比
fold与reduce的一个重要差别在于,前者在“op:(T,T)=>T”语句作用在一个分区的元素集合上时,提供了一个初始值。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。