前言

键值对(pair RDD)是Spark的一部分,与普通RDD具有相同的特性,却又拥有不同于普通RDD的一些特性和操作。
简单来pair RDD就是以key-value形式的RDD。

1 创建pair RDD

根据文本内容,以第一个单词作为键为例:

map()函数需要设置key-value参数,如该例中:key=x.split(" ")[0], value=x。

2 pair RDD的转换操作

pair RDD可以使用所有标准RDD上的可用的转化操作。但是由于pair RDD包含二元组,所以传递的函数操作的是二元组,而不是独立的元素。

以下测试数据均为键值对列表 [(1,2),(3,4),(3,6)]

2.1 reduceByKey
合并具有相同键的值

2.2 groupByKey
对具有相同键的值进行分组

如上图所示value值并没有直接显示,而显示多个值组成的迭代器,如果需要显示出来,如下:

2.3 mapValues
对RDD中的每个值应用一个函数,并不改变键

2.4 flatMapValues
对pair RDD中的每个值应用一个返回迭代器的函数,然后对返回的每个元素都生成一个对应原键的键值对记录

更多如:

以上操作为单个RDD操作,下面为两个RDD之间的操作:

以下RDD为:pair=[(1,2),(3,4),(3,6)],other=[(3,9)]
2.5 subtractByKey
删掉 pair 中与 other 相同键的元素

2.6 join
两个RDD进行内连接

更多如左外连接、右外连接、和将具有相同键的分组到一起:

其中,None表示值不存在。
2.7 filter
筛选 value 值长度大于50的元素

3 聚合操作

3.1 reduceByKey

  • 使用 reduceByKey 进行平均值计算
    1)分步计算:

    其中,rdd.map(lambda x: (x[0], x[1][0] / x[1][1])) 可以将 x 看做一个元素,即 x = (‘spark’, (13, 2)),所以 x[0] = ‘spark’,x[1] = (13, 2),x[1][0] = 13,x[1][1] = 2。
    2)一步计算:
  • 使用reduceByKey 进行单词统计

    更加简单的版本:

    只不过两个版本生成结果的数据格式略有不同。

3.2 combineByKey
求各个键对应的平均值

combineByKey() 有三个参数。

combineByKey原理简述:

combineByKey处理数据时,会遍历分区中所有的元素,所以某个元素要么是第一次出现,要么是该值的键以前出现过。
如果这是一个新的元素,combineByKey 会使用createCombiner()的函数创建那个键对应的累加器的初始值。注:该过程会发生在每个分区,而不是整个RDD过程只出现一次。
如果这是一个之前已经遇到的键,它会使用mergeValue()将该键对应的累加器的值与新值合并(求和)。
由于每个分区都是独立处理的,因此对于同一个键可以有多个累加器。如果有两个或以上分区都有同一个键对应的累加器,就需要用户提供mergeCombiners()方法将各个分区的结果进行合并。
因此,根据上述原理可以推断出combineByKey()的三个参数与上述过程一 一对应。(该推测仅为博主个人观点,如有不同欢迎指正)
即:

createCombiner()  == lambda x: (x, 1)
mergeValue()  ==  lambda x, y: (x[0]+y, x[1]+1)
mergeCombiners()  ==  lambda x, y: (x[0]+y[0], x[1]+y[1])

并行度调优:
每个RDD都有固定数目的分区,分区数决定了RDD执行操作时的并行度。
在执行聚合或分组操作时,可以要求Spark使用给定的分区数。Spark始终阐释根据集群的大小推断出一个有意义的默认值,但是有时候你可能要对并行度进行调优来获得更好的性能表现。
上述的大部分操作符都能接收第二个参数,这个参数用来指定分组结果或聚合结果的RDD的分区数,如:

getNumPartitions() 即获取RDD的分区数。

4 数据排序

sortByKey
ascending表示是否升序,keyfunc表示自定义排序函数(这里使用将键以字符串形式排序)

5 行动操作

和转化操作一样,所有基础RDD支持的传统行动操作也都在pair RDD上可用。这里还有额外的一些操作:
5.1 countByKey
对每个键对应的元素计数

5.2 collectAsMap
将结果以映射表的形式返回,从结果看,相同的key会覆盖

5.3 lookup
返回指定键的所有值

6 分区深入

这里简单描述博主认为关键的地方,至于更加详细的建议还是买本书籍吧。
对于RDD的分区,spark内部会默认选择合适分区方式、分区数。
分区方式如:范围分区、哈希分区。
但是,选择合适的分区方式、分区数是对spark调优的重要手段。
如果一个RDD已经有了分区方式,那么从该RDD转化出来的RDD也将拥有与父RDD相同的分区方式(但并不绝对,如父RDD采用哈希方式,对该RDD进行map()操作可能改变键,所以就没有固定的分区方式)。
以下操作会与父RDD拥有相同的分区方式:cogroup()、groupWith()、join()、leftOuterJoin()等等(并不是所有)。

自定义分区
定义分区能够调优spark的性能。
场景:对一个网站进行PageRank(计算一个网页在另一个网页出现链接的次数,以此排名)算法,在如www.cnn.com/WORLD和www.cnn.com/US,该两个页面可能分配到不同的节点上。但是,具有相同域名的URL相互之间存在链接的可能性更大。所以,最好是将这两个网页分配到同一个节点。
这里,就可以使用自定义分区方式。

import urlparsedef hash_domain(url):return hash(urlparse.urlparse(url).netloc)rdd.partitionBy(20, hash_domain)   # 20个分区

partitionBy() 函数为Python中设置分区的函数。

完!

04-键值对操作(pair RDD)相关推荐

  1. Spark 的键值对(pair RDD)操作,Scala实现

    一:什么是Pair RDD? Spark为包含键值对对类型的RDD提供了一些专有操作,这些操作就被称为Pair RDD,Pair RDD是很多程序的构成要素,因为它们提供了并行操作对各个键或跨节点重新 ...

  2. Spark中的键值对操作-scala

    1.PairRDD介绍 Spark为包含键值对类型的RDD提供了一些专有的操作.这些RDD被称为PairRDD.PairRDD提供了并行操作各个键或跨节点重新进行数据分组的操作接口.例如,PairRD ...

  3. Redis命令介绍之键值对操作

    前文已经提及过Redis中对于键值对操作的一些命令,如DEL.EXPIRE / PEXPIRE.TTL / PTTL以及EXISTS.今天我们继续介绍Redis中对键值对操作的相关命令. TYPE T ...

  4. Spark 杂记--- 键值对操作RDD

    1. 将一个普通的RDD转换为键值对RDD时,可以通过调用map()函数来实现,传递的函数需要返回键值对.   scala 版: scala> val lines =sc.parallelize ...

  5. Redis中的键值过期操作

    1.过期设置 Redis 中设置过期时间主要通过以下四种方式: expire key seconds:设置 key 在 n 秒后过期: pexpire key milliseconds:设置 key ...

  6. java redis 过期_Redis中的键值过期操作

    1.过期设置 Redis 中设置过期时间主要通过以下四种方式: expire key seconds:设置 key 在 n 秒后过期: pexpire key milliseconds:设置 key ...

  7. Python 字典创建、更新、按键值排序、取最大键值对等操作

    1. 字典创建 In [1]: d = {}In [2]: d Out[2]: {}In [3]: d = dict()In [4]: d Out[4]: {}In [5]: dict(a=1,b=2 ...

  8. Redis 键值过期操作

    过期设置 Redis 中设置过期时间主要通过以下四种方式: expire key seconds:设置 key 在 n 秒后过期: pexpire key milliseconds:设置 key 在 ...

  9. Mysql的键值对操作ELT FIELD

    返回索引值对应的字符串 ELT(N,str1,str2,str3,...)如果N =1返回str1; 如果N= 2返回str2; 如果参数的数量小于1或大于N返回NULL; 按照索引进行返回值mysq ...

最新文章

  1. Java Web编程的主要组件技术——MVC设计模式
  2. 【Linux】解决Linux服务器内存不足问题
  3. C#调用百度地图API入门解决BMap未定义问题
  4. 1008 Elevator (20 分)_13行代码AC
  5. FreeSql (二十九)Lambda 表达式
  6. 设计模式之我见系列——策略模式
  7. Scala的List集合和Set集合
  8. mysql bin_超级有用的15个mysqlbinlog命令
  9. Visual Studio Code是什么
  10. 小程序入门学习03--navigator组件
  11. No module named ‘win32gui‘ 的解决方法(踩坑之旅)
  12. html在线编辑器 哪个好用,可视化HTML富文本编辑器有哪些?哪个好用?
  13. Windows系统好用的文本编辑器
  14. Kylin中cube优化
  15. vue+element去重并且替换符号为英文分号
  16. AMR文件结构解析——时长解析
  17. IP地址绕过 . 拦截
  18. wps大纲栏显示在右边_5分钟帮你搞定PPT!金山偷偷上线WPS智能PPT完全免费
  19. 基于微信小程序云开发的校园类平台
  20. verilog语言实现简易二进制计算器

热门文章

  1. 计算机思维解决12个小球找坏球问题
  2. 蓝桥杯 传球游戏 c++实现
  3. 项目上线的积极准备工作
  4. Teamcenter2007 Thin client 配置成功
  5. 关于字符串、数字的输入
  6. [附源码]计算机毕业设计基于Java的员工管理系统Springboot程序
  7. 管理信息系统【六】之 系统设计
  8. win7计算机应用教程,win7系统使用教程
  9. stream.sum()
  10. MFC串口通信(二)——使用MSComm控件实现串口通信