Spark学习—PairRDD编程


 PairRDD:键值对RDD,其是Spark中转化操作常用的数据类型。上一篇文件《》我们就使用了PairRDD。PairRDD是很多程序的构成要素,因为他提供了并行操作或跨节点重新进行数据分组的操作接口。本文将结合Java示例讲解PairRDD相关接口操作。

一. PairRDD创建

很多存储键值对的数据格式会在读取时直接返回其键值对数据组成的pair RDD,同时也可以调用map()函数来实现,传递的函数需要返回键值对。
对应Java创建PairRDD,由于Java没有自带的二元组类型,因此Spark的Java API中使用scala.Tuple2类来创建二元组,同时使用mapToPair()函数来代替map()函数。
比如上一篇文章的例子:Spark学习—RDD编程

二. PairRDD相关接口

PairRDD本质还是RDD,相对RDD的操作方法接口,PairRDD都支持。

1. PairRDD的转化操作


函数名目的示例结果
reduceByKey(func)合并具有相同键的值rdd.reduceByKey((x, y) => x + y){(1,2), (3,10)}
groupByKey()对具有相同键的值进行分组rdd.groupByKey(){(1,[2]),(3, [4,6])}
combineByKey(
createCombiner,
mergeValue,
mergeCombiners,
partitioner)
使用不同的返回类型合并具有相同键的值
mapValues(func)对pair RDD 中的每个值应用一个函数而不改变键rdd.mapValues(x => x+1){(1,3), (3,5), (3,7)}
flatMapValues(func)对pair RDD 中的每个值应用一个返回迭代器的函数,然后对返回的每个元素都生成一个对应原键的键值对记录通常用于符号化rdd.flatMapValues(x => (x to 5)){(1,2), (1,3), (1,4),
(1,5), (3,4), (3,5)}
keys()返回一个仅包含键的RDDrdd.keys(){1, 3,3}
values()返回一个仅包含值的RDDrdd.values(){2, 4,6}
sortByKey()返回一个根据键排序的RDDrdd.sortByKey(){(1,2), (3,4), (3,6)}

Pair RDD的转化操作(以键值对集合{(1, 2), (3, 4), (3, 6)}为例)

combineByKey:最为常用的基于键进行聚合的函数,和aggregate()一样,combineByKey()可以返回与输入数据的类型不一样的返回值。
createCombiner:组合器函数,用于将V类型转换成C类型,输入参数为RDD[K,V]中的V,输出为C
mergeValue:合并值函数,将一个C类型和一个V类型值合并成一个C类型,输入参数为(C,V),输出为C
mergeCombiners:合并组合器函数,用于将两个C类型值合并成一个C类型,输入参数(C,C),输出为C
numPartitions:结果RDD分区数,默认保持原有的分区数
partitioner:分区函数,默认为HashPartitioner

函数名目的示例结果
subtractByKey删掉RDD 中键与other RDD 中的键
相同的元素
dd.subtractByKey(other){(1, 2)}
join对两个RDD 进行内连接rdd.join(other){(3, (4, 9)), (3,(6, 9))}
rightOuterJoin对两个RDD 进行连接操作,
确保第一个RDD 的键必须存在
(右外连接)
rdd.rightOuterJoin(other){(3,(Some(4),9)),
3,(Some(6),9))}
leftOuterJoin对两个RDD 进行连接操作,
确保第二个RDD 的键必须存在
(左外连接)
rdd.leftOuterJoin(other){(1,(2,None)),
(3,(4,Some(9))),
 (3,(6,Some(9)))}
cogroup将两个RDD 中拥有相同键的
数据分组到一起
rdd.cogroup(other){(1,([2],[])), (3,([4, 6],[9]))}
针对两个pair RDD的转化操作(rdd = {(1, 2), (3, 4), (3, 6)}other = {(3, 9)})

连接方式:左外连接、右外连接、交叉连接和内连接;
join:内连接,只有在两个pair RDD 中都存在的键才叫输出。当一个输入对应的某个键有多个值时,生成的pair RDD 会包括来自两个输入RDD 的每一组相对应的记录。
leftOuterJoin:在使用leftOuterJoin() 产生的pair RDD 中,源RDD 的每一个键都有对应的记录。每个键相应的值是由一个源RDD 中的值与一个包含第二个RDD 的值的Option(在Java 中为Optional)对象组成的二元组。
rightOuterJoin:rightOuterJoin() 几乎与leftOuterJoin() 完全一样,只不过预期结果中的键必须出现在第二个RDD 中,而二元组中的可缺失的部分则来自于源RDD 而非第二个RDD。
cogroup:对多个共享同一个键的RDD进行分组。对两个键的类型均为K 而值的类型分别为V 和W 的RDD 进行cogroup() 时,得到的结果RDD 类型为[(K, (Iterable[V], Iterable[W]))]。如果其中的一个RDD 对于另一个RDD 中存在的某个键没有对应的记录,那么对应的迭代器则为空。cogroup() 提供了为多个RDD 进行数据分组的方法。

2. PairRDD的行动操作


函数名目的示例结果
countByKey()对每个键对应的元素分别计数rdd.countByKey(){(1, 1), (3, 2)}
collectAsMap()将结果以映射表的形式返回,
以便查询
rdd.collectAsMap()Map{(1, 2), (3,4), (3, 6)}
lookup(key)返回给定键对应的所有值rdd.lookup(3)[4, 6]
Pair RDD的行动操作(以键值对集合{(1, 2), (3, 4), (3, 6)}为例)

三.示例



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值