Spark 键值对操作
2019年11月22日
简介
键值对RDD通常用来进行聚合计算
键值对RDD在各节点上分布情况的高级特性:分区
使用可控的分区方式把常被一起访问的数据放到同一个节点上,可以大大减少应用的同学开销,带来明显的性能提升。
为分布式数据集选取正确的分区方式。
pair RDD提供 reduceByKey()方法,可以分别规约每个键对应的数据。
Join()方法,可以把两个RDD中键相同的元素组合到一起,合并为一个RDD
创建Pair RDD
-
存取键值对数据格式会在读取时直接返回其键值对数据组成的pair RDD。
-
普通RDD转为pair RDD时,可以调用map()函数实现,传递的函数需要返回键值对。
- 在Scala中使用第一个单词作为键创建出一个pair RDD
val pairs = lines.map(x => (x.split(" ")(0), x))
- Scala从一个内存中的数据集创建pari RDD时,只需要对这个由二元组组成的集合调用SparkContext.parallelize()方法。
Pair RDD的转化操作
例:用Scala对第二个元素进行筛选
pairs.filter{
case (key, value) => value.length < 20}
聚合操作
reduceByKey()与reduce()类似,对数据集中的每个键进行并行的规约操作,每个规约操作会将键相同的值合并起来。返回一个新的RDD。
例:计算每个键对应的平均值
rdd.mapValues(x => (x, 1)).reduceByKey((x, y) => (x._1 + y._1, x._2 + y._2))
例:用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()。
combineByKey()是最为常用的基于键进行聚合的函数。和aggregate()一样,combineByKey()可以让用户返回与输入数据的类型不同的返回值。
combineByKey()有多个参数分别对应聚合操作的各个阶段,因而非常适合用来解释聚合操作各个阶段的功能划分。
例:在Scala中使用combineByKey()来求每个键对应的平均值