Spark由浅到深(3)-- 键值对型数据操作

版权声明:本文为博主原创文章,未经博主允许不得转载。对于文中涉及到的参考文章,感谢作者分享,侵删。 https://blog.csdn.net/Kohang/article/details/78350401

键值对 RDD 是 Spark 中许多操作所需要的常见数据类型。因此刚入门时候用来练手和熟悉Spark, 巩固之前所学是很有必要的.

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

Pair RDD 是很多程序的构成要素, 因为它们提供了并行操作各个键或跨节点重新进行数据分组的操作接口。


1. 创建Pair RDD

在 Spark 中有很多种创建 pair RDD 的方式。

构建键值对 RDD 的方法在不同的语言中会有所不同。

在 Python 中,为了让提取键之后的数据能够在函数中使用,需要返回一个由二元组组成的 RDD.

// 使用第一个单词作为键创建出一个 pair RDD
pairs = lines.map(lambda x: (x.split(" ")[0], x))

2. Pair RDD的转化操作

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

由于 pair RDD 中包含二元组,所以需要传递的函数应当操作二元组而不是独立的元素.

Pair RDD的转化操作函数有:

reduceByKey(func)       合并具有相同键的值
groupByKey()            对具有相同键的值进行分组
combineByKey(createCombiner,mergeValue,mergeCombiners,partitioner)              使用不同的返回类型合并具有相同键的值 
mapValues(func)pair RDD 中的每个值应用一个函数而不改变键 
flatMapValues(func)pair RDD 中的每个值应用一个返回迭代器的函数, 然后对返回的每个元素都生成一个对应原键的键值对记录。 通常用于符号化
keys()                  返回一个仅包含键的 RDD
values()                返回一个仅包含值的 RDD
sortByKey()             返回一个根据键排序的 RDD 

针对 两个 pair RDD的转化操作:

subtractByKey           删掉 RDD 中键与 other RDD 中的键相同的元素 
join                    对两个 RDD 进行内连接
rightOuterJoin          对两个 RDD 进行连接操作,确保第一个RDD的键必须存在(右外连接)
leftOuterJoin           对两个 RDD 进行连接操作,确保第二个RDD的键必须存在(左外连接) 
cogroup                 将两个 RDD 中拥有相同键的数据分组到一起 

Pair RDD 也还是 RDD(元素为 Python 中的元组),因此同样支持 RDD 所支持的函数。

// 前一节中的 pair RDD,筛选掉长度超过20 个字符的行
// Python 对第二个元素进行筛选

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

有时,我们只想访问 pair RDD 的值部分,这时操作二元组很麻烦。

由于这是一种常见的使用模式,因此 Spark 提供了 mapValues(func) 函数,功能类似于 map{case (x, y): (x,func(y))}。可以在很多例子中使用这个函数。

接下来就依次讨论 pair RDD 的各种操作,先从聚合操作开始。


2.2 聚合操作

当数据集以键值对形式组织的时候,聚合具有相同键的元素进行一些统计是很常见的操作。

基础型 RDD 上的 fold()、 combine()、 reduce() 等行动操作;
pair型 RDD 上则有相应的针对键的转化操作。

Spark 有一组类似的操作,可以组合具有相同键的值。
这些操作返回 RDD,因此它们是转化操作而不是行动操作。

reduceByKey() 与 reduce() 相当类似
foldByKey() 则与 fold() 相当类似

使用 reduceByKey() 和 mapValues() 来计算每个键的对应值的均值。这和使用 fold() 和 map() 计算整个 RDD 平均值的过程很相似.

// Python 中使用 reduceByKey() 和 mapValues() 计算每个键对应的平均值
rdd.mapValues(lambda x: (x, 1)).reduceByKey(lambda x, y: (x[0] + y[0], x[1] + y[1]))

combineByKey() 是最为常用的基于键进行聚合的函数。大多数基于键聚合的函数都是用它实现的。和 aggregate() 一样, combineByKey() 可以让用户返回与输入数据的类型不同的返回值。

理 解 combineByKey(), 要 先 理 解 它 在 处 理 数 据 时 是 如 何 处 理 每 个 元 素 的。 由 于combineByKey() 会遍历分区中的所有元素,因此每个元素的键要么还没有遇到过,要么就和之前的某个元素的键相同。

猜你喜欢

转载自blog.csdn.net/Kohang/article/details/78350401
今日推荐