spark中的pair rdd,看这一篇就够了

本文深入介绍了Spark中的Pair RDD,包括其定义、转化操作如keys、values、sortByKey、mapValues、flatMapValues、groupByKey、reduceByKey、foldByKey、combineByKey,以及连接操作和行动操作如countByKey、collectAsMap和lookup。Pair RDD的转化操作提供了更多灵活性,允许根据key进行聚合和复杂计算。文章以实例解析各个操作,帮助读者理解Pair RDD的使用方法。

本文始发于个人公众号:TechFlow,原创不易,求个关注


今天是spark专题的第四篇文章,我们一起来看下Pair RDD。

定义

在之前的文章当中,我们已经熟悉了RDD的相关概念,也了解了RDD基本的转化操作和行动操作。今天我们来看一下RDD当中非常常见的PairRDD,也叫做键值对RDD,可以理解成KVRDD。

KV很好理解,就是key和value的组合,比如Python当中的dict或者是C++以及Java当中的map中的基本元素都是键值对。相比于之前基本的RDD,pariRDD可以支持更多的操作,相对来说更加灵活,可以完成更加复杂的功能。比如我们可以根据key进行聚合,或者是计算交集等。

所以本身pairRDD只不过是数据类型是KV结构的RDD而已,并没有太多的内涵,大家不需要担心。

Pair RDD转化操作

Pair RDD也是RDD,所以之前介绍的RDD的转化操作Pair RDD自然也可以使用。它们两者有些像是类继承的关系,RDD是父类,Pair RDD是实现了一些新特性的子类。子类可以调用父类当中所有的方法,但是父类却不能调用子类中的方法。

调用的时候需要注意,由于我们的Pair RDD中的数据格式是KV的二元组,所以我们传入的函数必须是针对二元组数据的,不然的话可能运算的结果会有问题。下面我们来列举一些最常用的转化操作。

为了方便演示,我们用一个固定的RDD来运行各种转化操作,来直观了解一下这些转化操作究竟起什么样的作用。

ex1 = sc.parallelize([[1, 2], [3, 4], [3, 5]])

keys,values和sortByKey

这三个转化操作应该是最常用也是最简单的,简单到我们通过字面意思就可以猜出它们的意思。

我们先来看keys和values:

我们的RDD当中二元组当中的第一个元素会被当做key,第二个元素当做value,需要注

### SparkPair RDD 的使用方法及示例 #### 定义与创建 Pair RDD Pair RDD 是一种特殊的 RDD,其中每个元素都是由键值对组成的。可以利用现有的数据集通过转换操作来创建 Pair RDD。 ```python from pyspark import SparkContext sc = SparkContext("local", "pair_rdd_example") data = [(1, 2), (3, 4), (3, 6)] rdd = sc.parallelize(data) ``` 此代码片段展示了如何基于 Python 列表 `data` 创建一个名为 `rdd` 的 Pair RDD 实例[^1]。 #### 行动操作实例 ##### countByKey 用于统计每种键的数量: ```python result_count_by_key = rdd.countByKey() print(dict(result_count_by_key)) ``` 这段代码将会输出 `{1: 1, 3: 2}` ,表示对于给定的数据集中键 '1' 和 '3' 各自出现了一次和两次[^4]。 ##### collectAsMap 将整个 Pair RDD 收集到驱动程序端作为字典返回: ```python map_result = rdd.collectAsMap() print(map_result) ``` 这会打印出类似于 `defaultdict(<class 'list'>, {1: 2, 3: 4})` 结果;请注意这里只显示了第一个遇到的值,因为字典不允许重复键存在. ##### lookup 查找特定键关联的所有值: ```python looked_up_values = rdd.lookup(3) print(list(looked_up_values)) ``` 上述命令会展示 `[4, 6]` 这两个数值,它们都与键 '3' 关联在一起. #### 转换操作实例 考虑另一个例子说明 `subtractByKey` 方法的作用——它允许从当前 RDD 移除那些其键存在于参数指定的其他 RDD中的项: ```python another_data = [(3, 8), (5, 9)] another_rdd = sc.parallelize(another_data) subtracted_rdd = rdd.subtractByKey(another_rdd) collected_subtraction_results = subtracted_rdd.collect() for item in collected_subtraction_results: print(item) ``` 该脚本最终会输出 `(1, 2)` , 因为原本属于原 RDD 的一对 `(3, *)` 已经被移除了,而剩下的唯一一项就是 `(1, 2)` [^2].
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值