一、概念
-
RDD:弹性分布式数据集,简单来说就是元素的分布式集合,在Spark中,所有的工作都被表达为创建新的RDD,对已存在的RDD做变换,或者对RDD调用行动来计算得到一个结果
-
变换:指对RDD进行一次操作,生成另外一个RDD的过程
-
行动:指对RDD进行一次操作,返回一个计算结果的过程
二、变换算子
- 针对一个包含{1, 2, 3, 3}的RDD进行基本的变换
创建该RDD:
val rdd = sc.parallelize(Array(1, 2, 3, 3))
函数名 | 目的 | 示例 | 结果 |
---|---|---|---|
map() | 应用函数到RDD中的每一个元素,并返回一个结果RDD | rdd.map(x=>x+1) | {2, 3, 4, 4} |
flatMap() | 应用到RDD中的每一个元素,并且返回一个返回迭代器中内容的RDD, 一般用于提取单词 | rdd.flatMap(_.to(3)) | {1, 2, 3, 2, 3, 3, 3} |
filter() | 返回由仅通过传入filter()的条件的元素组成的RDD | rdd.filter(_ > 2) | {3, 3} |
distinct() | 去重 | rdd.distinct() | {1, 2, 3} |
Sample(withReplacement, fraction, [seed]) | RDD 采样数据,可替换 | rdd.sample(false, 0.5) | Nondeterministic |
替换采样:抽取一次之后放回数据,非替换采样:抽取一次之后不放回,后续不会再抽出该条数据
- 针对包含{1, 2, 3} 和 {3, 4, 5} 的两个RDD 进行变换
创建以上两个RDD:
val rdd = sc.parallelize(Array(1, 2, 3))
val other = sc.parallelize(Array(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中存在的元素 | rdd.subtract(other) | {1, 2} |
cartesian() | 生成两个RDD的笛卡尔积的RDD | rdd.cartesian(other) | {(1,3), (1,4), (1,5), (2,3), (2,4), (2,5), (3,3), (3,4), (3,5)} |
三、行动算子
- 对包含{1, 2, 3, 3}的RDD执行动作
函数名 | 目的 | 示例 | 结果 |
---|---|---|---|
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} |
takeSample(withReplacement, num, [seed]) | 随机返回RDD中的num个元素 | rdd.takeSample(false, 1) | Nondeterministic |
reduce(func) | 并行合并RDD中的元素 | rdd.reduce((x, y) => x + y) | 9 |
fold(zeroValue)(func) | 提供一个初始值,并根据函数合并RDD当中的元素(首先合并每个分区内的元素,然后合并分区间的元素) | rdd.fold(3)((x, y) => x + y) | 8分区值为36, 1个分区值为15 |
aggregate(zeroValue)(seqOp, combOp) | 提供一个初始值,和两个函数,第一个函数用于分区内元素合并,第二个函数用于分区间元素合并 | 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) | 对RDD中的每个元素应用函数func | rdd.foreach(func) | Nothing |