一、mapPartitions
mapPartition可以倒过来理解,先partition,再把每个partition进行map函数
适用场景
如果在映射的过程中需要频繁创建额外的对象,使用mapPartitions要比map高效。
比如,将RDD中的所有数据通过JDBC连接写入数据库,如果使用map函数,可能要为每一个元素都创建一个connection,这样开销很大,如果使用mapPartitions,那么只需要针对每一个分区建立一个connection。
下面的例子
java实现,把每一个元素平方
SparkConf conf = new SparkConf().setMaster("local[2]").setAppName("mappartitionsjava");
JavaSparkContext sc = new JavaSparkContext(conf);
JavaRDD<Integer> rdd = sc.parallelize(Arrays.asList(1,2,3,4,5,6,7,8,9,10));
JavaRDD<Integer> rdd1 = rdd.mapPartitions(new FlatMapFunction<Iterator<Integer>, Integer>() {
@Override
public Iterator<Integer> call(Iterator<Integer> it) throws Exception {
ArrayList<Integer> list = new ArrayList<>();
while (it.hasNext()) {
int i = it.next();
list.add(i*i);
}
return list.iterator();
}
});
List<Integer> collect = rdd1.collect();
for (Integer i:collect) {
System.out.println(i);
}
输出:
2
4
9
16
25
36
49
64
81
100
java实现,把每一个数字i变成一个map(i,i*i)的形式
SparkConf conf = new SparkConf().setMaster("local[2]").setAppName("mappartitionsjava");
JavaSparkContext sc = new JavaSparkContext(conf);
JavaRDD<Integer> rdd = sc.parallelize(Arrays.asList(1,2,3,4,5,6,7,8,9,10));
JavaRDD<Tuple2<Integer, Integer>> tuple2JavaRDD = rdd.mapPartitions(new FlatMapFunction<Iterator<Integer>, Tuple2