Spark RDD操作总结

转换类

filter:遍历+筛选

call函数每次输入一个rdd内的元素;输出bool值,真则保留,假则抛弃。最终filter将会得到对原rdd全部筛选一遍后的结果rdd

map:遍历+转换

call函数每次输入一个rdd内的元素;输出根据输入元素转换之后的值。最终map将会输出全部元素转换之后的rdd。

例如,原RDD={1,2,3,4,5},call转换规则是x/10,map之后的RDD={0.1,0.2,0.3,0.4,0.5}

flatMap:遍历+压扁

call函数每一次输入一个rdd内的元素;输出这个元素的切分结果(列表,这种操作就是所谓的压扁)。最终这些列表重新组合成新的rdd

例如,原RDD={"A B C", "D", "E F"},切分原则是按空格对字符串进行切分,flatMap后的RDD={"A", "B", "C", "D", "E", "F"}

*如果用map进行遍历和转换,call同样得对每个元素进行空格切分并输出切分后的列表,结果会变成:{{"A", "B", "C"}, {"D"}, {"E", "F"}}

union:合并

无函数

distinct:去重

RDD不是严格的集合,里面常常会有重复元素。此操作可以得到一个元素唯一的RDD。

*此操作会导致数据发生全网混洗!

intersection:求并集

找出两个RDD都有的元素,并去重

*此操作会导致数据发生全网混洗!

subtract:求差集

找出第一个(主调对象)RDD中存在,但是第二个(传入对象)RDD中没有的对象。

例如,第一个RDD:(1, 1, 2, 2, 3, 3, 4, 5, 6);第二个RDD:(1, 1, 2, 5, 6, 7, 7, 8, 9);结果:(3,3,4)

*此操作会导致数据发生全网混洗!

cartesian:求笛卡尔集

求两个rdd的笛卡尔积,得到的结果rdd是pairRdd,键来自第一个(主调)rdd,值来自第二个(传入)rdd

*此操作开销巨大,会导致数据发生全网混洗!

行动类

reduce:规约

如果rdd只有一个分区:对rdd进行规约,举个例子,假设规约规则(call函数)是 输出=输入1+输入2,这样对于rdd={1,2,3,4,5,6},reduce过程为:1+2=3;3+3=6;6+4=10;10+5=15;15+6=21。

call函数每次输入前一次计算的结果(第一个输入参数)和一个新rdd元素(第二个输入参数),然后将两者规约之后,作为下次call的第一个输入参数。

如果rdd有多个分区:先分别对各个分区进行归约,然后对分区规约结果再进行规约,例如rdd={1,2,3,4,5,6},由两个分区:1,2,3和4,5,6。那么,reduce过程为:

1+2=3;3+3=6;

4+5=9;9+6=15;

6+15=21

fold:规约

与reduce高度类似,稍微不同的是允许指定每次规约(有n个分区,就需要n+1次规约)允许指定初始值。而reduce里面,初始值是rdd的第一个元素。

举例,假设规约规则(call函数)是 输出=输入1+输入2,rdd={1,2,3,4,5,6},由两个分区:1,2,3和4,5,6。初始值为0,那么,fold过程为:

0+1=1;1+2=3;3+3=6;

0+4=4;4+5=9;9+6=15;

0+6=6;6+15=21

aggregate:规约

无论是reduce还是fold,对于分区内和分区间的规约函数是一致的。而aggregate允许分别定义分区内和分区间的规约函数。

另外,reduce和fold要求规约结果类型和rdd内元素类型一致,而aggregate允许规约结果类型与rdd内元素类型不同

count:统计RDD内元素个数

无函数,这个操作常用于对RDD积累的惰性操作强制执行。

countByValue:值相同的元素分组统计元素个数

take:取元素

从rdd中取出头部若干个元素

top:取元素

根据某种排序(默认顺序或者自定义排序函数),取出头部若干个元素

takeSample:取元素

取样,从rdd中随机取出若干个元素

colloct:取全部元素

从rdd中取出全部元素

take和colloct操作中提到的“取出”,都是指将数据从各个Spark Slave中收集到驱动器进程中。需要注意的是,这种操作“取出”的数据不能太大,否则驱动器进程放不下!

foreach:遍历,无返回

遍历rdd,并进行操作。操作结束后不收集任何数据到驱动器程序。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值