Spark学习—— (6) 键值对RDD编程(基于Python)

键值对RDD是许多操作所需要的常见数据类型,也叫做pair RDD通常我们会从一个RDD提取某些信息作为新的RDD的键,构成一个键值对RDD。

pair RDD也是RDD,所以上一篇笔记中介绍的RDD操作对pair RDD同样适用。

本文介绍针对键值对RDD的常用操作及实例。

文章目录

      • 1. pair RDD的创建
      • 2. pair RDD的Transformation操作
        • 2.1 单个pair RDD
        • 2.2 两个pair RDD
      • 3. pair RDD的Action操作
      • 4. RDD数据分区操作
      • Reference

1. pair RDD的创建

  1. 很多存储键值对的数据格式会在读取时直接返回由其键值对数据组成的pair RDD
  2. 使用map把普通RDD转化为pair RDD,map的函数要返回键值对,如以每个句子的第一个字母作为键

2. pair RDD的Transformation操作

2.1 单个pair RDD

  1. reduceByKey,提供一个函数,对key相同的value进行运算,如字符串拼接
  1. groupByKey,将key相同的value合并为一个迭代器,得到(key, iterator)形式的pair RDD
Spark学习—— (6) 键值对RDD编程(基于Python)_第1张图片
  1. mapValues,对values进行map操作,如改成大写
  1. flatMapValues,对values做flatMap操作,如分词
Spark学习—— (6) 键值对RDD编程(基于Python)_第2张图片
  1. keys、values、sortByKey,分别获取key构成的RDD、value构成的RDD、按照key排序的pair RDD
  1. combineByKey,如下,传递三个函数
combineByKey(self, createCombiner, mergeValue, mergeCombiners,...)
    * createCombiner,每个分区中的每个键第一次出现时调用,同一个键可以在不同分区有不同的Combiner
    * mergeValue,分区中的键再次出现时调用
	* mergeCombiners,合并不同分区中相同键的Combiner
  1. sortByKey,按照key值排序,默认为升序

2.2 两个pair RDD

  1. subtractByKey,减去key相同的键值对,如下:
  1. join,对两个RDD进行内连接,即key相同的进行连接,如下:
  1. leftOuterJoin、rightOuterJoin,左外连接和右外连接,如下:
  1. cogroup,相当于两个RDD所有数据进行groupByKey,如下:
Spark学习—— (6) 键值对RDD编程(基于Python)_第3张图片

3. pair RDD的Action操作

  1. countByKey,对每个key进行计数,如下:
  1. collectAsMap,把键值对转化为字典形式,但是键值相同的数据只保留最后一份,如下:
  1. lookup,查询每个键对应的value集合,如下:

4. RDD数据分区操作

在分布式程序中,通信的代价是很大的,因此控制数据分布以获得最少的网络传输可以极大地提升整体性能。

对RDD进行预分区的操作为partitionBy,获得一个新的RDD,这个RDD中,相同键值(hash)或一个范围内的键值的元素存放在同一个分区中。

Spark程序可以通过控制RDD分区方式减少通信开销,要注意到——

  • 对RDD进行预分区也是一次开销大的通信,所以若RDD只使用一次,做预分区反而效率更低
  • 对RDD进行预分区应该是该RDD多次使用、且使用场景是基于键的连接、分组等操作(宽依赖?)

举个例子——

假设有一个很大的用户信息表,即由 (UserID, UserInfo) 对组成的RDD,记录每个用户感兴趣的话题。
另外系统每5分钟生成一张用户行为表,即由 (UserID, VisitInfo) 对组成的RDD,记录过去5分钟每个用户浏览的话题。

现在要通过join操作得到每个用户的兴趣话题和实际浏览话题,对比分析。

  • 假设直接进行join操作,则通信情况如下左,每次都需要对两个RDD的键值哈希,把哈希值相同的传到同一个节点上运算,开销大。
  • 实际上,userData多次被使用,故应该对其进行预分区并持久化(而不是对原来的RDD持久化,否则每次都会做预分区的操作),则通信情况如下右,减少了很多通信。
Spark学习—— (6) 键值对RDD编程(基于Python)_第4张图片

数据分区有益的操作一般有cogroupjoinleftOuterJoinrightOuterJoingroupByKeyreduceByKeycombineByKeylookup 等。

Reference

  1. 《Spark快速大数据分析》
  2. Spark学习之路 (三)Spark之RDD
  3. Spark之深入理解RDD结构

你可能感兴趣的:(大数据学习记录)