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

键值对 RDD 通常用来进行聚合计算。我们一般要先通过一些初始 ETL(抽取、转化、装载)操作来将数据转化为键值对形式。

Spark 为包含键值对类型的 RDD 提供了一些专有的操作。

1.创建Pair RDD

    val input = sc.parallelize(List(1, 2, 3, 4))
  val pairs = input.map(x => (x+1, x))
for (pair <- pairs){
println(pair)
}
  //输出
(2,1)
(3,2)
(4,3)
(5,4)

2.Pair RDD的转化操作

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

Pair RDD也支持RDD所支持的函数

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

3.聚合操作

类似fold() 、 combine() 、 reduce() 等行动操作,这些操作返回 RDD,因此它们是转化操作而不是行动操作。

reduceByKey()函数,接收一个函数,并使用这个函数对值进行合并

val wordCount = textFile.flatMap(line => line.split(" ")).map(word => (word, 1)).reduceByKey((a, b) => a + b)  #切分成单词,转换成键值对并计数

或者

input.flatMap(x => x.split(" ")).countByValue()

foldByKey()函数,也是接收一个函数,并使用这个函数对值进行合并,提供初始值

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

countByValue()函数

val textFile = sc.textFile(inputFile)
val result1 = textFile.flatMap(x => x.split(" ")).countByValue()
println(result1)
输出:Map(cc -> 3, aa -> 6, bb -> 3, ee -> 3, ff -> 2, hh -> 1, dd -> 1, gg -> 1)

combineByKey()函数,使用 combineByKey() 求每个键对应的平均值

    val data = Seq(("a", 3), ("b", 4), ("a", 1))
val input2 = sc.parallelize(data)
//使用 combineByKey() 求每个键对应的平均值
val result2 = input2.combineByKey(
(v) => (v, 1),
(acc: (Int, Int), v) => (acc._1 + v, acc._2 + 1),
(acc1: (Int, Int), acc2: (Int, Int)) => (acc1._1 + acc2._1, acc1._2 + acc2._2)
).map{ case (key, value) => (key, value._1 / value._2.toFloat) }
result2.collectAsMap().map(println(_)) //输出
(b,4.0)
(a,2.0)

4.数据分组

groupByKey()函数,将数据根据键进行分组

val data = Seq(("a", 3), ("b", 4), ("a", 1))
val input2 = sc.parallelize(data)
val result3 = input2.groupByKey()
for (result <- result3)
println(result) //输出:
(a,CompactBuffer(3, 1))
(b,CompactBuffer(4))

5.连接

join操作符

    val input = sc.parallelize(List(1, 2, 3, 4))
val pairs1 = input.map(x => (x+1, x))
//输出(2,1),(3,2),(4,3),(5,4)
val pairs2 = input.map(x => (x+1, 1))
//输出(2,1),(3,1),(4,1),(5,1)
for(pair <- pairs1.join(pairs2)){
println(pair)
}
//输出(4,(3,1)),(3,(2,1)),(5,(4,1)),(2,(1,1))

有时,我们不希望结果中的键必须在两个 RDD 中都存在,join的部分可以不存在

leftOuterJoin(other) 和 rightOuterJoin(other) 都会根据键连接两个 RDD,但是允许结果中存在其中的一个 pair RDD 所 缺失的键。

leftOuterJoin(other)结果

(4,(3,Some(1)))
(3,(2,Some(1)))
(5,(4,Some(1)))
(2,(1,Some(1)))

rightOuterJoin(other)结果

(4,(Some(3),1))
(3,(Some(2),1))
(5,(Some(4),1))
(2,(Some(1),1))

6.数据排序

在 Scala 中以字符串顺序对整数进行自定义排序

    val input = sc.parallelize(List(1, 2, 3, 4))
val pairs1 = input.map(x => (x + 1, x))
implicit val sortIntegersByString = new Ordering[Int] {
override def compare(a: Int, b: Int) = b.toString.compare(a.toString)
}
for(pair <- pairs1.sortByKey())
println(pair)

//输出
(5,4)
(4,3)
(3,2)
(2,1)

Spark学习笔记——键值对操作的更多相关文章

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

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

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

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

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

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

  4. Spark中的键值对操作

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

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

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

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

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

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

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

  8. Spark学习笔记之SparkRDD

    Spark学习笔记之SparkRDD 一.   基本概念 RDD(resilient distributed datasets)弹性分布式数据集. 来自于两方面 ①   内存集合和外部存储系统 ②   ...

  9. Spark学习笔记3——RDD(下)

    目录 Spark学习笔记3--RDD(下) 向Spark传递函数 通过匿名内部类 通过具名类传递 通过带参数的 Java 函数类传递 通过 lambda 表达式传递(仅限于 Java 8 及以上) 常 ...

随机推荐

  1. 潭州课堂25班:Ph201805201 并发(通信) 第十三课 (课堂笔记)

    from multiprocessing import Process # 有个 url 列表 ,有5个 url ,一次请求是1秒,5个5秒 # 要求1秒把 url 请求完, a = [] # 在进程 ...

  2. angularJs中的checkboxs

    <!DOCTYPE html><html> <head> <meta charset="UTF-8"> <title>& ...

  3. C++学习笔记41:进程调度

    进程调度策略:先进先出,时间片轮转,普通调度,批调度,高优先级抢先 子进程与父进程的调度没有固定的顺序:不能假设子进程一定会在父进程之后执行,也不能假设子进程一定会在父进程之前执行: 僵尸进程 子进程 ...

  4. 2D Tookit简单教程

    1. 在Project Window中点击Create > tk2d > Sprite Collection”点击Sprite Collection,创建一个Sprite Collecti ...

  5. exce中42093和日期之间的关系

    在EXECEL中数字0 代表日期 1900-1-0 ,即这个日期为起始日期,算是第0天数字1 代表日期 1900-1-1 ,即第一天数字2 代表日期 1900-1-2 ,即第二天......数字415 ...

  6. [Beego模型] 二、CRUD 操作

    [Beego模型] 一.ORM 使用方法 [Beego模型] 二.CRUD 操作 [Beego模型] 三.高级查询 [Beego模型] 四.使用SQL语句进行查询 [Beego模型] 五.构造查询 [ ...

  7. Java 多线程(七) 线程间的通信——wait及notify方法

    线程间的相互作用 线程间的相互作用:线程之间需要一些协调通信,来共同完成一件任务. Object类中相关的方法有两个notify方法和三个wait方法: http://docs.oracle.com/ ...

  8. PPPOE

    本质上,它是一个允许在以太网广播域中的两个以太网接口间创建点对点隧道的协议. PPPoE(英语:Point-to-Point Protocol Over Ethernet),以太网上的点对点协议,是将 ...

  9. caffe中的fine-tuning

    caffe finetune两种修改网络结构prototxt方法 第一种方法:将原来的prototxt中所有的fc8改为fc8-re.(若希望修改层的学习速度比其他层更快一点,可以将lr_mult改为 ...

  10. iOS: lame框架将PCM录音转成MP3格式

    lame框架将PCM录音转成MP3格式 1.lame下载地址:https://github.com/rbrito/lame,它是一个不可执行的文件,需要借助build-lame.sh脚本将其编译成.a ...