Spark—键值对操作
简述
键值对RDD是Spark中许多操作所需要的常见数据类型。一般通过一些初始ETL(抽取、转化、装载)操作将数据转化为键值对形式。
动机
Spark中包含键值对类型的RDD被称为pair RDD。Pair RDD是很多程序的构成要素,因为它们提供了并行操作各个键或跨节点重新进行数据分组的操作接口。
创建Pair RDD
Python中,为了让提取键之后的数据能够在函数中使用,需要返回一个由二元组组成的RDD。
pairs = lines.map(lambda x: (x.split(" "), x))
Pair RDD的转换操作
Pair RDD可以使用所以标准RDD上的可用的转化操作。同样,传递函数规则也适用于Pair RDD。
- Pair RDD的转化操作,以键值对集合{(1,2), (3,4), (3,6)}为例
函数名 | 目的 | 示例 | 结果 |
---|---|---|---|
reduceByKey(func) | 合并具有相同键的值 | rdd.reduceByKey(lambda x, y: x+y) | {(1,2), (3,10)} |
groupByKey() | 对具有相同键的值进行分组 | rdd.groupByKey() | {(1,[2]), (3, [4, 6])} |
combineByKey(createCombiner, mergeValue, mergeCombiners, partitioner) | 使用不同的返回类型合并具有相同键的值 | ||
mapValues(func) | 对pair RDD的每个值应用一个函数而不改变键 | rdd.mapValues(lambda x: x+1) | {(1, 3), (3, 5), (3, 7)} |
flatMapValues(func) | 对pair RDD中的每个值应用一个返回迭代器的函数,然后对返回的每个元素生成一个对应原键的键值对记录。通常用于符号化。 | >>>def s(x): return x >>>rdd.flatMapValues(s).collect() #此时的rdd,二元组中的value应该为集合(list等) |
|
keys | 返回一个仅包含键的RDD | rdd.keys() | [1,3,3] |
values | 返回一个仅包含值的RDD | rdd.values() | [2,4,6] |
sortByKey() | 返回一个根据键排序的RDD | rdd.sortByKey() | [(1,2), (3, 4), (3, 6)] |
- 针对两个pair RDD的转化操作(rdd=[(1,2), (3,4), (3,6)] other=[(3,9)])
函数名 | 目的 | 示例 | 结果 |
---|---|---|---|
subtractByKey() | 删除RDD中键与otherRDD中的键相同的元素 | rdd.subtractByKey(other) | [(1,2)] |
join | 对两个RDD进行内连接 | rdd.join(other) | [(3, (4,9)), (3, (6,9))] |
rightOuterJoin | 对两个RDD进行连接操作,确保第一个RDD的键必修存在(右外连接) | rdd.rightOuterJoin(other) | [(3,(Some(4), 9)), (3, (Some(6), 9))] |
leftOuterJoin | 对两个RDD进行连接操作,确保第二个RDD的键必须存在(左外连接) |