本篇博客中的操作都在 ./bin/pyspark 中执行。

对单个 Pair RDD 的转化操作

下面会对 Pair RDD 的一些转化操作进行解释。先假设我们有下面这些RDD(在pyspark中操作):

nums = sc.parallelize( [ (1,2)       ,(3,4)       ,(3,6)      ] )
x = sc.parallelize( [ (1,[2,4,5]) ,(4,[7,8,0]) ,(4,[6,7,5])] )

reduceByKey

概述:合并具有相同键值

例子:

>>> nums.reduceByKey(lambda x, y : x + y).collect()
[(1, 2), (3, 10)]
>>>
>>> x.reduceByKey(lambda x, y: x + y).collect()
[(1, [2, 4, 5]), (4, [7, 8, 0, 6, 7, 5])]

这个方法操作的是值(Values),对上面的两个RDD的操作,第一个是对值做加法,第二个是对列表合并;这两个操作都可以使用lambda x, y : x + y来完成。

再来一个例子,求平均值,(下面的这个RDD的键值中,第一个值是总和,第二个值是数量):

>>> test = sc.parallelize([('panda', (1,2)), ('pink',(7,2)), ('pirate',(3,1))])
>>> test.mapValues(lambda (x,y): x / (y* 1.0)).collect()
[('panda', 0.5), ('pink', 3.5), ('pirate', 3.0)]

groupByKey

groupByKey 方法的目的是对具有相同键值的数据进行分组,比如说:

>>> l = nums.groupByKey().collect()[1][1]
>>> l
<pyspark.resultiterable.ResultIterable object at 0x109320f10>
>>> for i in l:
... print i
...
4
6

直观地来说,对nums这个RDD的groupByKey操作可以表示为:

[(1,2),(3,4),(3,6)]  ->  [ (1,[2]), (3, [4,6] )]

然后是对于x这个RDD的:

>>> x    = sc.parallelize( [ (1,[2,4,5]) ,(4,[7,8,0]) ,(4,[6,7,5])] )

>>> l = x.groupByKey().collect()
>>> l
[(1, <pyspark.resultiterable.ResultIterable object at 0x109310690>), (4, <pyspark.resultiterable.ResultIterable object at 0x109310050>)] >>> l2 = l[1][1]
>>> l2
<pyspark.resultiterable.ResultIterable object at 0x109310050> >>> for i in l2:
... print i
...
[7, 8, 0]
[6, 7, 5]

直观的来说:

[  (1,[2,4,5]), (4,[7,8,0]) ,(4,[6,7,5] ) ]
+
| +-------------+
| | RDD.join |
| +-------------+
v
[ (1,[2,4,5]), (4, [ [6,7,5], [7,8,0] ] ) ]

mapValues

这个比较好理解,对每个键值进行操作:

>>> nums.mapValues(lambda x : x+ 3).collect()
[(1, 5), (3, 7), (3, 9)]

flatMapValues

这个方法的作用是对pair RDD 的每个值(values)生成一个与原键(key)对应的键值对记录。

x  = sc.parallelize( [ (1,[2,4,5]) ,(4,[7,8,0]) ,(4,[6,7,5])] )

>>> def f(x):
... return x
... >>> x.flatMapValues(f).collect()
[(1, 2), (1, 4), (1, 5), (4, 7), (4, 8), (4, 0), (4, 6), (4, 7), (4, 5)]

这个可以用"flat"这个英文单词的意思来大致理解一下,flat有使变平,拍扁的意思。

对于 nums 这种RDD是进行不了这个方法的。

keys()

返回所有的键值:

>>> nums.keys().collect()
[1, 3, 3]
>>> x.keys().collect()
[1, 4, 4]

values

返回所有的值:

>>> nums.values().collect()
[2, 4, 6]
>>> x.values().collect()
[[2, 4, 5], [7, 8, 0], [6, 7, 5]]

sortByKey

按照键值排序,这个比较好理解:

>>> notSorted = sc.parallelize( [ (7,[2,4,5]) ,(9,[7,8,0]) ,(4,[6,7,5])] )

>>> notSorted.sortByKey().collect()
[(4, [6, 7, 5]), (7, [2, 4, 5]), (9, [7, 8, 0])]

对2个Pair RDD的转化操作

这里我们有:

other = sc.parallelize([(3,9)])
nums = sc.parallelize([(1,2),(3,4),(3,6)])

subtractByKey

返回一个减去两个RDD中一样的Key的RDD,可以理解为除去下图中重合的部分

一个例子:

>>> nums.subtractByKey(other).collect()
[(1, 2)]

join

这个操的作描为:返回一个RDD,返回的RDD只包含输入的两个RDD都包含的键值,每个键值对形如(k, (v1, v2)),其中v1被自己包含,v2被另一个RDD包含。一个例子:

>>> x = sc.parallelize([("a", 1), ("b", 4)])
>>> y = sc.parallelize([("a", 2), ("a", 3)])
>>> x.join(y).collect()
[('a', (1, 2)), ('a', (1, 3))]

可以理解为:

同理换做我们开始提到的两个RDD:

>>> nums.join(other).collect()
[(3, (4, 9)), (3, (6, 9))]

rightOuterJoin && leftOuterJoin

这两个方法的Join的原理和上面的join一样,关于left 和 right 的说明是:

  • right:确保右边的RDD的键必须存在
  • left:确保左边的RDD的键必须存在

一个例子:

>>> nums.rightOuterJoin(other).collect()
[(3, (4, 9)), (3, (6, 9))] >>> nums.leftOuterJoin(other).collect()
[(1, (2, None)), (3, (4, 9)), (3, (6, 9))]

[Spark] Pair RDD常见转化操作的更多相关文章

  1. spark中RDD的转化操作和行动操作

    本文主要是讲解spark里RDD的基础操作.RDD是spark特有的数据模型,谈到RDD就会提到什么弹性分布式数据集,什么有向无环图,本文暂时不去展开这些高深概念,在阅读本文时候,大家可以就把RDD当 ...

  2. spark Pair RDD 基础操作

    下面是Pair RDD的API讲解 转化操作 reduceByKey:合并具有相同键的值: groupByKey:对具有相同键的值进行分组: keys:返回一个仅包含键值的RDD: values:返回 ...

  3. Spark RDD概念学习系列之Pair RDD的transformation操作

    不多说,直接上干货! Pair RDD的transformation操作 Pair RDD转换操作1 Pair RDD 可以使用所有标准RDD 上转化操作,还提供了特有的转换操作. Pair RDD转 ...

  4. Spark RDD概念学习系列之Pair RDD的action操作

    不多说,直接上干货! Pair RDD的action操作 所有基础RDD 支持的行动操作也都在pair RDD 上可用

  5. Spark中RDD的常用操作(Python)

    弹性分布式数据集(RDD) Spark是以RDD概念为中心运行的.RDD是一个容错的.可以被并行操作的元素集合.创建一个RDD有两个方法:在你的驱动程序中并行化一个已经存在的集合:从外部存储系统中引用 ...

  6. Spark学习之键值对(pair RDD)操作(3)

    Spark学习之键值对(pair RDD)操作(3) 1. 我们通常从一个RDD中提取某些字段(如代表事件时间.用户ID或者其他标识符的字段),并使用这些字段为pair RDD操作中的键. 2. 创建 ...

  7. Spark学习摘记 —— RDD转化操作API归纳

    本文参考 在阅读了<Spark快速大数据分析>动物书后,大概了解到了spark常用的api,不过书中并没有给予所有api具体的示例,而且现在spark的最新版本已经上升到了2.4.5,动物 ...

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

    本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是spark专题的第四篇文章,我们一起来看下Pair RDD. 定义 在之前的文章当中,我们已经熟悉了RDD的相关概念,也了解了RDD基 ...

  9. [Spark] Spark的RDD编程

    本篇博客中的操作都在 ./bin/pyspark 中执行. RDD,即弹性分布式数据集(Resilient Distributed Dataset),是Spark对数据的核心抽象.RDD是分布式元素的 ...

随机推荐

  1. smarty

    模板引擎是用于把模板文件和数据内容合并在一起的程序,便于网站开发有利于代码分离和维护,了解一个模板最好知道其工作原理,以便于实现一通万通. 模板文件一般是HTML xml js等类型文件,如果不用模板 ...

  2. Ubuntu启动项设置——之update-rc.d 命令使用

    http://blog.csdn.net/typ2004/article/details/38712887 apache2.nginx.redis这些服务安装之后,会随开机启动,当这些服务并不需要时, ...

  3. C语言之程序结构

    一个好的程序首先要有好的程序结构,我从变量和结构两个方面来做分析. 一.浅谈程序中的变量 一个程序架构最基本的就是程序变量,谈到程序中的变量,我们应该考虑两部分,一方面是变量的作用域,一方面是变量的生 ...

  4. STM32的GPIO

    一.I/O端口位的基本结构 二.端口位配置表 参考:STM32芯片参考手册

  5. Controllers, Actions 和 Action Results

    Controllers, Actions 和 Action Results 原文:Controllers, Actions, and Action Results作者:Steve Smith翻译:姚阿 ...

  6. Dynamips做CCNA的实验,说是找不到telnet的解决方案

    01.如果你的系统是32位的系统. 控制面板-程序与功能-启动或关闭windows功能-开启telnet(重启计算机就可以用telnet了) 02.如果你的系统是64位的系统. (1)控制面板-程序与 ...

  7. 分享七款视差滚动效果的jQuery 插件

    视差(Parallax)是指从不同的点看一个物体时形成的视觉差异,这个名词是源自希腊文的παράλλαξις (parallaxis),意思是”改变”.在网页设计中,视差滚动(Parallax Scr ...

  8. Unreal Engine4 蓝图入门

    微信公众号:UE交流学习    UE4开发群:344602753 蓝图是Unreal Engine的特点,用C++编程固然好,但是效率要低很多,主要是国内资料比较少,所以不太容易学习,用蓝图编程可以节 ...

  9. CT 来值班,让您安心过新年!

    春节,盼了整整一年的节日,我们一定要抛开工作,狠狠的开心,狠狠的幸福,但是作为苦逼的运维,你们真的能完全抛开工作(对网站不闻不问)吗?OneAPM CT 24 小时监控您的网站,让您无忧无虑过新年. ...

  10. 练习PYTHON协程之GREENLET

    STACKLESS就算了,了解一下原理即可. GREENLET,GEVENT,EVENTLET这些,比较好测试,还是都 撸一次,得个印象. 测试代码都是网上的大路货. from greenlet im ...