一、基本的RDD操作
1.RDD的转化操作
表1-1:对数据为{1,2,3,3}的RDD进行基本的转化操作
函数 |
目的 |
实例 |
结果 |
map() |
将函数应用于RD'D中的每个元素 |
rdd.map(x=>x+1) |
{2,3,4,4} |
flatMap() |
将函数应用于RD'D中的每个元素,将返回的迭代器的所有内容构成新的RDD |
rdd.flatMap(x=>x.to(3)) |
{1,2,3,2,3,3,3} |
filter() |
过滤 |
rdd.filter(x=>x!=1) |
{2,3,3} |
distinct() |
去重 |
rdd.distinct() |
{1,2,3} |
sample(withReplacement,fraction,[seed]) |
采样,以及是否替换 |
rdd.sample(false,0.5) |
非确定 |
表1-2:对数据{1,2,3},{3,4,5}的RDD进行转化操作
函数 |
目的 |
示例 |
结果 |
union() |
并集 |
rdd.union(other) |
{1,2,3,3,4,5} |
intersection() |
交集 |
rdd.intersection(other) |
{3} |
subtract() |
差集 |
rdd.substract(other) |
{1,2} |
cartesian() |
笛卡儿积 |
rdd.cartesian(other) |
{(1,3),(1,4),(1,5),(2,3),(2,4),(2,5),(3,3),(3,4),(3,5)} |
2.RDD行为操作
表1-3:对{1,2,3,3}的RDD进行操作
函数 |
目的 |
示例 |
结果 |
collect() |
返回RDD中的所有元素 |
rdd.collect() |
{1,2,3,3} |
count() |
计数 |
rdd.count() |
4 |
countByValue() |
各元素在RDD中出现的次数 |
rdd.countByValue() |
{(1,1),(2,1),(3,2)} |
take(n) |
返回n个元素 |
rdd.take(2) |
{1,2} |
top(n) |
返回最前面的n个元素 |
rdd.top(2) |
{3,3} |
takeOrdered(n)(ordering) |
按照提供的顺序返回前n个元素 |
rdd.takeOrdered(2)(myOrdering) |
{3,3} |
takeSample(withReplacement,num,[seed]) |
返回任意一些元素 |
rdd.takeSample(false,1) |
非确定的 |
reduce() |
归并 |
rdd.reduce(_+_) |
9 |
fold()() |
类似于reduce,但需要初始值 |
rdd.fold(0)(_+_) |
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() | 对 RDD 中的每个元素使用给 定的函数 |
rdd.foreach(func) |
- |
二、pairRDD的操作
1.pairRDD的转化操作
表2-1:以{(1,2),(3,4),(3,6)}为例
函数 |
目的 |
示例 |
结果 |
reduceByKey() |
合并具有相同键的值 |
rdd.reduceByKey(_+_) |
{(1,2),(3,10)} |
groupByKey() |
对具有相同键的值进行分组 |
rdd.groupByKey() |
{(1,[2]),(3,[4,6])} |
combinByKey(createCombiner, mergeValue,mergeCombiners,partitioner) |
使用不同的返回类型合并具有相同键的值 |
- |
- |
mapValues(func) |
对V应用func |
rdd.mapValues(x=>x+1) |
{(1,3),(3,5),(3,7)} |
flatMapValues() | 对V应用func(该func返回迭代器),然后对返回的每一个元素都生成一个对应原键的键值对 |
rdd.flatMapValues(x=>(x to 5)) |
{(1,2),(1,3),(1,4),(1,5),(3,4),(3,5)} |
keys() |
返回仅包含键的RDD |
rdd.keys() |
{1,3,3} |
values() |
返回仅包含值的RDD |
rdd.values() |
{2,4,6} |
sortByKey() |
返回根据键排序的RDD |
rdd.sortByKey() |
{(1,2),(3,4),(3,6)} |
表2-2:rdd=>{(1,2),(3,4),(3,6)} other=>{(3,9)}
函数 | 目的 |
示例 |
结果 |
subtractByKey |
删掉rdd中键与other中键相同的元素 |
rdd..subtractByKey(other) |
{(1,2)} |
join |
内链接 |
rdd.join(other) |
{(3,(4,9)),(3,(6,9))} |
rightOuterJoin |
右外连接 |
rdd.rightOuterJoin(other) |
{(3,(Some(4),9)),(3,(Some(6),9))} |
leftOuterJoin |
左外连接 |
rdd.leftOuterJoin(other) |
{(1,(2,None)),(3,(4,Some(9))),(3,(6,Some(9)))} |
cogroup |
将两个RDD中有相同键的数据放到一起 |
rdd.cogroup(other) |
{(1,([2],[])),(3,([4,6],[9]))} |
2.pairRDD的行为操作
表2-3:rdd=>{(1,2),(3,4),(3,6)
函数 |
目的 |
示例 |
结果 |
countByKey() |
对每个键对应的元素分别计数 |
rdd.countByKey() |
{(1,1),(3,2)} |
collectAsMap() |
将结果以映射表的形式返回 |
rdd.collectAsMaop() |
Map{(1,2),(3,4),(3,6)} |
lookup(key) |
返回给定键对应的所有值 |
rdd.lookup(3) |
[4,6] |
【注】本文参考《Spark快速大数据分析》