import org.apache.spark.SparkConf;
import org.apache.spark.api.java.JavaRDD;
import org.apache.spark.api.java.JavaSparkContext;
import org.apache.spark.api.java.function.FlatMapFunction;
import org.apache.spark.api.java.function.Function;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
/**
* mapPartitions(function,boolean) 算子
* 通过function函数将RDD中的每一个元素转换为另一个新的元素,并返回一个新的RDD.
* 第二个boolean类型的参数是用于优化的目的,默认为false,可以省略。
* 如果进行修改分区时,设置为true会提高修改分区的效率。
*
*
* 与map的区别:
* 1.map执行的粒度不同,map每次执行计算只调用一个元素,而mapPatririons每次计算调用一个分区的元素。
* 2.map执行过后元素的数量不变,而mapPatririon执行后返回的元素的数量可以改变。
*
*
*
*/
public class MapPartitionsDemo {
public static void main(String[] args) {
SparkConf conf = new SparkConf().setMaster("local").setAppName("spark");
JavaSparkContext sc = new JavaSparkContext(conf);
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6);
JavaRDD<Integer> javaRDD = sc.parallelize(list,2);
//mapPartitions算子:求从0到javaRDD元素的数字组成的RDD
JavaRDD<Integer> javaRDD1 = javaRDD.mapPartitions(new FlatMapFunction<Iterator<Integer>, Integer>() {
@Override
public Iterator<Integer> call(Iterator<Integer> integerIterator) throws Exception {
List<Integer> arrayList = new ArrayList<>();
while (integerIterator.hasNext()){
int flag = integerIterator.next();
for (int i=0;i<=flag;i++){
arrayList.add(flag * i);
}
}
return arrayList.iterator();
}
},true);
System.err.println(javaRDD1.collect());
//修改分区为4
JavaRDD<Integer> integerJavaRDD = javaRDD1.repartition(4);
System.out.println(integerJavaRDD.collect());
//mapPartitions算子的lambda形式:求从0到javaRDD元素的数字组成的RDD
JavaRDD<Integer> javaRDD2 = javaRDD.mapPartitions(integerIterator -> {
List<Integer> arrayList = new ArrayList<>();
while (integerIterator.hasNext()){
int flag = integerIterator.next();
for (int i=0;i<=flag;i++){
arrayList.add(flag * i);
}
}
return arrayList.iterator();
},true);
System.err.println(javaRDD2.collect());
}
}
Jave Spark算子:mapPartitions
最新推荐文章于 2023-05-04 11:56:48 发布