【Spark学习笔记】5、Java版-算子系列之mapPartitions(f:Iterator[T] => Iterator[U]) : RDD[T] => RDD[U]

本文深入探讨了Spark中mapPartitions操作符的使用方法及其与map操作符的区别。通过具体示例,展示了如何利用mapPartitions处理大量数据,提高处理效率。同时,也提醒了在数据量过大时使用该操作符可能遇到的内存溢出问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

源码

/**
 * Return a new RDD by applying a function to each partition of this RDD.
 *
 * `preservesPartitioning` indicates whether the input function preserves the partitioner, which
 * should be `false` unless this is a pair RDD and the input function doesn't modify the keys.
 */
def mapPartitions[U: ClassTag](
    f: Iterator[T] => Iterator[U],
    preservesPartitioning: Boolean = false): RDD[U] = withScope {
  val cleanedF = sc.clean(f)
  new MapPartitionsRDD(
    this,
    (context: TaskContext, index: Int, iter: Iterator[T]) => cleanedF(iter),
    preservesPartitioning)
}

demo

public class MapPartitionsOperator {

	public static void main(String[] args) {
		SparkConf conf = new SparkConf().setAppName("MapPartitionsOperator").setMaster("local");
		JavaSparkContext sc = new JavaSparkContext(conf);

		List<String> names = Arrays.asList("zhangsan", "lisi", "wangwu");
		JavaRDD<String> nameRDD = sc.parallelize(names);

		final Map<String, Integer> scoreMap = new HashMap<String, Integer>();
		scoreMap.put("zhangsan", 150);
		scoreMap.put("lisi", 100);
		scoreMap.put("wangwu", 90);

		/**
		 * map算子,一次处理一个partition的一条数据!
		 * 
		 * mapParatitions算子,一次处理一个partition中所有的数据!
		 * 
		 * 使用场景
		 * 
		 * 如果RDD数据不是特别多,采用mapPartitions算子代替map算子可以加快处理速度
		 * 
		 * 如果RDD数据过多,不建议使用,容易内存溢出
		 */
		JavaRDD<Integer> scoreRDD = nameRDD.mapPartitions(new FlatMapFunction<Iterator<String>, Integer>() {
			private static final long serialVersionUID = 1L;

			@Override
			public Iterable<Integer> call(Iterator<String> iter) throws Exception {
				List<Integer> list = new ArrayList<Integer>();
				while (iter.hasNext()) {
					String name = iter.next();
					Integer score = scoreMap.get(name);
					list.add(score);
				}
				return list;
			}
		});
		scoreRDD.foreach(new VoidFunction<Integer>() {
			private static final long serialVersionUID = 1L;

			@Override
			public void call(Integer score) throws Exception {
				System.out.println(score);
			}
		});
		sc.close();
	}

}

输出

150
100
90

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值