温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

spark RDD算子中Key-Value型Transformation算子的示例分析

发布时间:2021-12-10 11:53:10 来源:亿速云 阅读:152 作者:小新 栏目:云计算

这篇文章主要为大家展示了“spark RDD算子中Key-Value型Transformation算子的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“spark RDD算子中Key-Value型Transformation算子的示例分析”这篇文章吧。

Key-Value型Transformation算子

Transformation处理的数据为Key-Value形式的算子,大致可以分为3种类型:输入分区与输出分区一对一、聚集、连接操作。

1.输入分区与输出分区一对一

mapValues(f)

针对(Key, Value)型数据中的 Value进行Map操作,而不对Key进行处理。

图3-19中的方框代表RDD分区。a=>a+2代表只对(V1,1)数据中的1进行加2操作,返回结果为3。

spark RDD算子中Key-Value型Transformation算子的示例分析

2.对单个RDD或两个RDD聚集

(1)单个RDD聚集

1)combineByKey(createCombiner, mergeValue, mergeCombiners, numPartitions=None, partitionFunc=<function portable_hash at 0x7fa664f3cb90>)

说明:

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))。

spark RDD算子中Key-Value型Transformation算子的示例分析

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)。

spark RDD算子中Key-Value型Transformation算子的示例分析

3)partitionBy(numPartitions, partitionFunc=<function portable_hash at 0x7fa664f3cb90>)

partitionBy函数对RDD进行分区操作。

如果原有RDD的分区器和现有分区器(partitioner)一致,则不重分区,如果不一致,则相当于根据分区器生成一个新的ShuffledRDD。

图3-22中的方框代表RDD分区。通过新的分区策略将原来在不同分区的V1、V2数据都合并到了一个分区。

spark RDD算子中Key-Value型Transformation算子的示例分析

(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)))。

spark RDD算子中Key-Value型Transformation算子的示例分析

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))。

spark RDD算子中Key-Value型Transformation算子的示例分析

(2)leftOutJoin和rightOutJoin

LeftOutJoin(左外连接)和RightOutJoin(右外连接)相当于在join的基础上先判断一侧的RDD元素是否为空,如果为空,则填充为空。如果不为空,则将数据进行连接运算,并返回结果。

以上是“spark RDD算子中Key-Value型Transformation算子的示例分析”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注亿速云行业资讯频道!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI