Key-Value型Transformation算子ide
Transformation处理的数据为Key-Value形式的算子,大体能够分为3种类型:输入分区与输出分区一对1、汇集、链接操做。函数
1.输入分区与输出分区一对一spa
mapValues(f)orm
针对(Key, Value)型数据中的 Value进行Map操做,而不对Key进行处理。hash
图3-19中的方框表明RDD分区。a=>a+2表明只对(V1,1)数据中的1进行加2操做,返回结果为3。it
2.对单个RDD或两个RDD汇集io
(1)单个RDD汇集table
1)combineByKey(createCombiner, mergeValue, mergeCombiners, numPartitions=None, partitionFunc=<function portable_hash at 0x7fa664f3cb90>)function
说明:form
createCombiner: V => C,在C不存在的状况下,如经过V建立seq C。
mergeValue: (C, V) => C,当C已经存在的状况下,须要merge,如把item V加到seq C中,或者叠加。
mergeCombiners: (C, C) => C,合并两个C。
partitioner: Partitioner(分区器), Shuffle时须要经过Partitioner的分区策略进行分区。
mapSideCombine: Boolean = true,为了减少传输量,不少combine能够在map端先作。例如,叠加能够先在一个partition中把全部相同的Key的Value叠加,再shuffle。
serializerClass: String = null,传输须要序列化,用户能够自定义序列化类。
例如,至关于将元素为(Int,Int)的RDD转变为了(Int, Seq[Int])类型元素的RDD。
图3-20中的方框表明RDD分区。经过combineByKey,将(V1, 2)、(V1, 1)数据合并为(V1, Seq(2, 1))。
2)reduceByKey(func, numPartitions=None, partitionFunc=<function portable_hash at 0x7fa664f3cb90>)
reduceByKey是更简单的一种状况,只是两个值合并成一个值,因此createCombiner很简单,就是直接返回v,而mergeValue和mergeCombiners的逻辑相同,没有区别。
图3-21中的方框表明RDD分区。经过用户自定义函数(A, B)=>(A + B),将相同Key的数据(V1, 2)、(V1, 1)的value相加,结果为(V1, 3)。
3)partitionBy(numPartitions, partitionFunc=<function portable_hash at 0x7fa664f3cb90>)
partitionBy函数对RDD进行分区操做。
若是原有RDD的分区器和现有分区器(partitioner)一致,则不重分区,若是不一致,则至关于根据分区器生成一个新的ShuffledRDD。
图3-22中的方框表明RDD分区。经过新的分区策略将原来在不一样分区的V一、V2数据都合并到了一个分区。
(2)对两个RDD进行汇集
cogroup(other, numPartitions=None)
cogroup函数将两个RDD进行协同划分,对在两个RDD中的Key-Value类型的元素,每一个RDD相同Key的元素分别聚合为一个集合,而且返回两个RDD中对应Key的元素集合的迭代器。其中,Key和Value,Value是两个RDD下相同Key的两个数据集合的迭代器所构成的元组。
图3-23中的大方框表明RDD,大方框内的小方框表明RDD中的分区。将RDD1中的数据(U1, 1)、(U1, 2)和RDD2中的数据(U1, 2)合并为(U1, ((1, 2), (2)))。
3.链接
(1)join
join对两个须要链接的RDD进行cogroup函数操做,cogroup原理请见上文。cogroup操做以后造成的新RDD,对每一个key下的元素进行笛卡尔积操做,返回的结果再展平,对应Key下的全部元组造成一个集合,最后返回RDD[(K, (V, W))]
图3-24是对两个RDD的join操做示意图。大方框表明RDD,小方框表明RDD中的分区。函数对拥有相同Key的元素(例如V1)为Key,以作链接后的数据结果为(V1,(1,1))和(V1,(1,2))。
(2)leftOutJoin和rightOutJoin
LeftOutJoin(左外链接)和RightOutJoin(右外链接)至关于在join的基础上先判断一侧的RDD元素是否为空,若是为空,则填充为空。若是不为空,则将数据进行链接运算,并返回结果。