算子(RDD Operations):
对于初学者来说,算子的概念比较抽象,算子可以直译为 “RDD的操作”, 我们把它理解为RDD的方法即可 。
转换算子(transformations):
转换算子会从一个已经存在的数据集(RDD)中生成一个新的数据集(RDD),比如map就是一个转换算子,它通过映射关系从一个RDD生成了一个新的RDD。
行动算子(actions):
行动算子在进行数据集计算后会给driver程序返回一个值。
转换算子和行动算子最大的区别:
转换算子返回一个数据集而行动算子返回一个具体值,如reduce算子是行动算子 而 reducebykey是转换算子;
同时由于spark的惰性求值特性,所有的转换算子是不会立即计算结果的,转换算子只记录它应用的数据集,在行动算子需要给drive返回数据时转换算子才会去计算结果。(这个设计能让spark运行效率更高)
行动算子列举
System.out.println("---------ollect()以数组的形式返回数据集---------");
System.out.println( javaPairRDD.collect());
System.out.println("---------count()返回RDD中元素个数---------");
System.out.println( javaPairRDD.count());
System.out.println("---------first()返回RDD中的第一个元素---------");
System.out.println( javaPairRDD.first());
System.out.println("---------take()返回由RDD前n个元素组成的数组---------");
System.out.println( javaPairRDD.take(10));
System.out.println("---------countByKey()统计每种key的个数---------");
System.out.println( javaPairRDD.countByKey());
System.out.println("---------save相关算子---------");
javaPairRDD.saveAsTextFile("output1/");
javaPairRDD.saveAsObjectFile("output2/");
System.out.println("-----------foreach()遍历RDD中每一个元素--------");
javaPairRDD.foreach(new VoidFunction<Tuple2<Integer, String>>() {
@Override
public void call(Tuple2<Integer, String> integerStringTuple2) throws Exception {
System.out.println("这是key:"+integerStringTuple2._1+" 这是Value:"+integerStringTuple2._2);
}
});
System.out.println("-----------foreachPartition ()遍历RDD中每一个分区--------");
javaPairRDD.foreachPartition(new VoidFunction<Iterator<Tuple2<Integer, String>>>() {
@Override
public void call(Iterator<Tuple2<Integer, String>> tuple2Iterator) throws Exception {
System.out.println("分区:"+tuple2Iterator.toString());
while (tuple2Iterator.hasNext()) {
System.out.println(tuple2Iterator.next());
}
}
});
转换算子列举
一、Value类型
map()映射
flatMap()扁平化
groupBy()分组
filter()过滤
distinct()去重
sortBy()排序
二、key_Value类型
mapValues()只对V进行操作
groupByKey()按照K重新分组
reduceByKey()按照K聚合V
sortByKey()按照K进行排序
1)reduceByKey:按照key进行聚合,在shuffle之前有combine(预聚合)操作,返回结果是RDD[K,V]。
2)groupByKey:按照key进行分组,直接进行shuffle。