键值对RDD是Spark中许多操作所需要的常见数据类型。

“分区”是用来让我们控制键值对RDD在各节点上分布情况的高级特性。使用可控的分区方式把常在一起被访问的数据放在同一个节点上,可以大大减少应用的通信开销,带来明显的性能提升。

4.1 动机

  Spark为pair RDD提供了并行操作各个键或跨节点重新进行数据分组的操作接口。

4.2 创建Pair RDD

  当需要把一个普通的RDD转为pair RDD时,可以调用map()函数来实现。下例为如何将由文本行组成的RDD转换为以每行的第一个单词为键的pair RDD。

  例4-1: 在Python中使用第一个单词作为键创建出一个pair RDD

pairs = lines.map(lambda x: (x.split(" ")[0], x))

  例4-2: 在Scala中使用第一个单词作为键创建出一个pair RDD

val pairs = lines.map(x => (x.split(" ")(0), x))

  4.3 Pair RDD的转化操作

    Pair RDD可以使用所有标准RDD上的可用的转化操作。

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

      rdd.reduceByKey((x, y)=>x+y) 结果:{(1,2), (3,10)}

      rdd.groupByKey()                    结果:{(1,[2]),(3,[4,6])}

      rdd.mapValues(x => x+1)        结果:{(1,3),(3,5),(3,7)}

      rdd.keys()                                结果:{1,3,3}

      rdd.values()                             结果:{2,4,6}

      rdd.sortByKey()                       结果:{(1,2),(3,4),(3,6)}

    筛选掉长度超过20个字符的行,如下:

    例4-4: 用Python对第二个元素进行筛选

result = pairs.filter(lambda keyValue: len(keyValue[1]<20))

    例4-5: 用Scala对第二个元素进行筛选、

pairs.filter{case (key, value) => value.length < 20}

      4.3.1 聚合操作

      使用reduceByKey()和mapValues()来计算每个键的对应值的均值。

      例4-7:在Python中使用reduceByKey()和mapValues()计算每个键对应的平均值

rdd.mapValues(lambda x:(x, 1)).reduceByKey(lambda x, y: (x[0]+y[0], x[1]+y[1]))

      例4-8:在Python中使用reduceByKey()和mapValues()计算每个键对应的平均值

rdd.mapValues(x => (x, 1)).reduceByKey((x, y) => (x._1 + y._1, x._2 + y._2))

      解决分布式单词计数问题如下

      例4-9: 用Python实现单词计数

rdd = sc.textFile("s3://...")
words = rdd.flatMap(lambda x: x.split(" "))
result = words.map(lambda x: (x, 1)).reduceByKey(lambda x, y:x+y)

      例4-10: 用Scala实现单词计数

val input = sc.textFile("s3://...")
val words = input.flatMap(x => x.split(" "))
val result = words.map(x => (x, 1)).reduceByKey((x, y) => x+y)

      我们可以使用countByValue()函数,以更快地实现单词计数:input.flatMap(x => x.split(" ")).countByValue().

      Spark怎样确定如何分割工作:每个RDD都有固定数目的分区,分区数决定了在RDD上执行操作时的并行度。

      例4-15: 在Python中自定义reduceByKey()的并行度

data = [("a", 3), ("b", 4), ("a", 1)]
sc.parallelize(data).reduceByKey(lambda x, y: x+y, 10)

    4.3.2 数据分组

      略

    4.3.3 连接

      连接数据操作:将有键的数据与另一组有键的数据一起使用。连接方式:右外连接、左外连接、交叉连接以及内连接。

      例4-17:在Scala shell中进行内连接

storeAddress = {
(Store("Ritual"), "AAA"), (Store("Philz"), "BBB"),
(Store("Philz"), "CCC"), (Store("Starbucks"), "DDD")} storeRating = {
(Store("Ritual"), 4.9), (Store("Philz"), 4.8)} storeAddress.rightOuterJoin(storeRating) == {
(Store("Ritual"), "AAA", 4.9)),
(Store("Philz"), "BBB", 4.8)),
(Store("Philz"), "CCC", 4.8))}

      例4-18:leftOuterJoin()与rightOuterJoin()

storeAddress = {
(Store("Ritual"), "AAA"), (Store("Philz"), "BBB"),
(Store("Philz"), "CCC"), (Store("Starbucks"), "DDD")} storeRating = {
(Store("Ritual"), 4.9), (Store("Philz"), 4.8)} storeAddress.rightOuterJoin(storeRating) == {
(Store("Ritual"), (Some("AAA"), 4.9)),
(Store("Philz"), (Some("BBB"), 4.8)),
(Store("Philz"), (Some("CCC"), 4.8))} storeAddress.leftOuterJoin(storeRating) == {
(Store("Ritual"), ("AAA", Some(4.9))),
(Store("Starbucks"),("DDD",None)),
(Store("Philz"), ("BBB", Some(4.8))),
(Store("Philz"), ("CCC", Some(4.8)))}

     4.3.4 数据排序

      略

      

键值对操作 上(Spark自学五)的更多相关文章

  1. Spark学习之键值对操作总结

    键值对 RDD 是 Spark 中许多操作所需要的常见数据类型.键值对 RDD 通常用来进行聚合计算.我们一般要先通过一些初始 ETL(抽取.转化.装载)操作来将数据转化为键值对形式.键值对 RDD ...

  2. Spark学习笔记——键值对操作

    键值对 RDD是 Spark 中许多操作所需要的常见数据类型 键值对 RDD 通常用来进行聚合计算.我们一般要先通过一些初始 ETL(抽取.转化.装载)操作来将数据转化为键值对形式. Spark 为包 ...

  3. Redis源码解析:09redis数据库实现(键值对操作、键超时功能、键空间通知)

    本章对Redis服务器的数据库实现进行介绍,说明Redis数据库相关操作的实现,包括数据库中键值对的添加.删除.查看.更新等操作的实现:客户端切换数据库的实现:键超时相关功能的实现.键空间事件通知等. ...

  4. go 发送post请求(键值对、上传文件、上传zip)

    一.post请求的Content-Type为键值对 1.PostForm方式 package main import ( "net/http" "net/url" ...

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

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

  6. Spark中的键值对操作

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

  7. Spark学习笔记3:键值对操作

    键值对RDD通常用来进行聚合计算,Spark为包含键值对类型的RDD提供了一些专有的操作.这些RDD被称为pair RDD.pair RDD提供了并行操作各个键或跨节点重新进行数据分组的操作接口. S ...

  8. Spark基础:(三)Spark 键值对操作

    1.pair RDD的简介 Spark为包含键值对类型的RDD提供了一些专有的操作,这些RDD就被称为pair RDD 那么如何创建pair RDD呢? 在不同的语言中有着不同的创建方式 在pytho ...

  9. spark入门(三)键值对操作

    1 简述 Spark为包含键值对类型的RDD提供了一些专有的操作.这些RDD被称为PairRDD. 2 创建PairRDD 2.1 在sprk中,很多存储键值对的数据在读取时直接返回由其键值对数据组成 ...

随机推荐

  1. 关于EINTR错误的理解【转】

    转自:http://www.xuebuyuan.com/1470645.html 最近在工作中遇到了EINTR错误,感到比较困惑,几番研究之后,颇有心得和收获,特记录如下,便于以后查询,也给有同样困惑 ...

  2. iptables 用法及常用模块总结

    iptables传输数据包的过程: 1. 当一个数据包进入网卡时,它首先进入PREROUTING链,内核根据数据包目的IP判断是否需要转送出去. 2. 如果数据包就是进入本机的,它就会沿着图向下移动, ...

  3. hdu 1364(差分约束)

    King Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 12056   Accepted: 4397 Description ...

  4. LUA脚本中O(2)级素数查询

    --================================================================================================== ...

  5. 2016noipday1t1玩具迷题结题报告

    经常读这个代码有益于比赛时想起一些思路.... day1t1,洛谷dalao称之为水题...??然后我去年还是没拿到分,就这个,我还就写了40%的数据,AC到40,然而这不是关键,注释了freopen ...

  6. POJ1386Play on Words(欧拉回路)

                                                             Play on Words Time Limit: 1000MS   Memory L ...

  7. [BZOJ 2342] 双倍回文

    Link:https://www.lydsy.com/JudgeOnline/problem.php?id=2342 Algorithm: 解决回文串问题,一般从对称轴下手. 肯定先跑一边Manach ...

  8. 【树状数组】【枚举约数】 - Ambitious Experiment

    给定一个序列,支持以下操作: 对区间[l,r]的每个i,将1i,2i,3i,...这些位置的数都加d. 询问某个位置的数的值. 如果把修改看作对区间[l,r]的每个数+d,那么询问x位置上的数时,显然 ...

  9. 【kruscal】【最小生成树】【块状树】bzoj3732 Network

    跟去年NOIP某题基本一样. 最小生成树之后,就变成了询问连接两点的路径上的权值最大的边. 倍增LCA.链剖什么的随便搞. 块状树其实也是很简单的,只不过每个点的点权要记录成“连接其与其父节点的边的权 ...

  10. 1.4(Mybatis学习笔记)关联映射

    一.一对一 mybatis处理一对一主要通过<resultMap>中的<association>元素来处理. <association>元素主要使用方方式有两种: ...