Spark键值对操作(python实验版)
说明:此处介绍的是pair RDD特有的操作,前面介绍的基础RDD操作,也适用pair RDD。
一、创建pair RDD
1、将普通RDD转换成pair RDD时,使用map()实现。
pairs = lines.map(lambda x: (x.split(" ")[0], x)) #在Python中使用第一个单词作为键创建出一个pair RDD,如图:
二、Pair RDD的转化操作
(以键值对集合{(1, 2), (3, 4), (3, 6)}为例)
1、reduceByKey(func) :合并具有相同键的值。
2、groupByKey() :对具有相同键的值进行分组,常用于单个数据分组,多个数据按键分组,参考下面函数cogroup( )
上图最后结果:[(1,[2]),(3,[4,6])]
上面collect()是一个ResultIterable结果集迭代对象,我使用了list()函数转换为列表,然后打印。
3、combineByKey( createCombiner,mergeValue,mergeCombiners,partitioner) :使用不同的返回类型合并具有相同键的值。
4、mapValues(func) :对pairRDD中的每个值应用一个函数而不改变键。
5、flatMapValues(func) :对pair RDD 中的每个值应用一个返回迭代器的函数,然后对返回的每个元素都生成一个对应原键的键值对记录。通常用于符号化。
6、keys() :返回一个仅包含键的RDD
7、values() :返回一个仅包含值的RDD
8、sortByKey() :返回一个根据键排序的RDD
该函数常用于数据排序,接收一个叫作ascending 的参数,表示我们是否想要让结果按升序排序(默认值为True)。还有一个参数numPartitions,该参数决定排序后的RDD的分区个数,默认排序后的分区个数和排序之前的个数相等,有时我们也可能想按完全不同的排序依据进行排序。要支持这种情况,我们可以提供自定义的比较函数。
升序:
降序:
自定义:
#以字符串顺序对整数进行自定义排序
以上是针对一个键值对集合,下面是针对两个pair RDD的转化操作(rdd = {(1, 2), (3, 4), (3, 6)} other = {(3, 9)})
1、subtractByKey :删掉RDD 中键与other RDD 中的键相同的元素
2、join :对两个RDD进行内连接
3、rightOuterJoin :对两个RDD 进行连接操作,确保第一个RDD的键必须存在(右外连接)
4、leftOuterJoin :对两个RDD进行连接操作,确保第二个RDD 的键必须存在(左外连接)
5、cogroup():将两个RDD中拥有相同键的数据分组到一起
上面结果:[ ( 1 , ( [2] , [ ] ) ) , (3 , ( [4 , 6] , [9] ) ) ]
注意:上面2、3、4、5是连接操作,将有键的数据与另一组有键的数据一起使用是对键值对数据执行的最有用的操作之一。连
接数据可能是pair RDD最常用的操作之一。连接方式多种多样:右外连接、左外连接、交叉连接以及内连接。三、Pair RDD的行动操作(以键值对集合{(1, 2), (3, 4), (3, 6)}为例)
1、countByKey() :对每个键对应的元素分别计数
因为countByKey()已经是行动操作,所以测试时,不能用c.collect()了,直接print c则可。
2、collectAsMap() :将结果以映射表的形式返回,以便查询
注意:上面第一个操作结果中只有2对值,因为collectAsMap()使用时,如果RDD中同一个Key中存在多个Value,那么后面的Value将会把前面的Value覆盖,最终得到的结果就是Key唯一,而且对应一个Value。
3、lookup(key) :返回给定键对应的所有值