Transformation
基本 RDD 的 transformation
假设有一个 RDD ,其中的元素有 {1, 2, 3, 3}:
函数 | 目的 | 示例 | 结果 |
---|---|---|---|
map() |
将函数应用到 RDD 中的每一个元素并以 RDD 的形式返回结果 | rdd.map(x => x+1) |
{2, 3, 4, 4} |
flatMap() |
将函数应用到 RDD 中的每一个元素,并以 RDD 的形式返回 iterator 的内容。通常用于提取词语。 | rdd.flatMap(x => x.to(3)) |
{1, 2, 3, 2, 3, 3, 3} |
filter() |
返回一个 RDD, 该 RDD 中仅包含了能够通过 filter() 函数的元素 |
rdd.filter(x => x != 1) |
{2, 3, 3} |
distinct() |
去除重复项 | rdd.distinct() |
{1, 2, 3} |
两个 RDD 的 transformation
假设有两个 RDD, 分别包含了 {1, 2, 3} 和 {3, 4, 5}:
函数 | 目的 | 示例 | 结果 |
---|---|---|---|
union() |
并集,生成一个包含了两个 RDD 元素的 RDD | rdd.union(other) |
{1, 2, 3, 3, 4, 5} |
intersection() |
交集,生成 RDD 包含了在两个 RDD 中同时出现的元素 | rdd.intersection(other) |
{3} |
subtract() |
移除一个 RDD 中的内容 | rdd.subtract(other) |
{1, 2} |
cartesian() |
以另一个 RDD 的 笛卡尔积 | rdd.cartesian(other) |
{(1, 3), (1, 4), (1, 5), (2, 3), (2, 4)}, ..., (3, 5) |
Action
假设有一个 RDD ,其中的元素有 {1, 2, 3, 3}:
函数 | 目的 | 示例 | 结果 |
---|---|---|---|
collect() |
返回 RDD 中的所有元素 | rdd.collect() |
{1, 2, 3, 3} |
count() |
RDD 中的元素数目 | rdd.count() |
4 |
countByValue() |
RDD 中每个元素出现的次数 | rdd.countByValue() |
{(1, 1), (2, 1), (3, 2)} |
take(num) |
返回 RDD 中的 num 个元素 | rdd.take(2) |
{1, 2} |
top(num) |
返回 RDD 中的前 num 个元素 | rdd.top(2) |
{3, 3} |
takeOrdered(num)(ordering) |
基于 ordering 返回 num 个元素 | rdd.takeOrdered(2)(myOrdering) |
{3, 3} |
takeSample(withReplacement, num, [seed]) |
随机返回 num 个元素 | rdd.takeSample(false, 1) |
不确定 |
reduce(func) |
并行地组合 RDD 中的元素(比如,sum) | rdd.reduce((x, y) => x + y) |
9 |
fold(zero)(func) |
与 reduce() 一样只是需要提供一个 0 |
rdd.fold(0)((x, y) => x + y) |
9 |
aggregate(zeroValue)(seqop, combop) |
与 reduce() 相似,不过用于返回不同类型 |
rdd.aggregate((0, 0))((x, y) => (x._1 + y, x._2 + 1), (x, y) => (x._1 + y._1, x._2 + y._2)) |
(9, 4) |
foreach(func) |
将 func 应用到 RDD 中的每一个元素 | rdd.foreach(func) |
无 |
以上内容参见 <<Learning Spark>>, 其代码示例可在 GitHub 上找到 learning-spark.