转换类
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,并进行操作。操作结束后不收集任何数据到驱动器程序。