Spark mapPartitionsWithIndex算子

本文详细介绍了Spark中mapPartitionsWithIndex算子的功能和使用方法,通过Java和Scala代码示例展示了如何利用该算子对RDD进行分区级别的操作,并附加分区信息,适用于大数据处理场景。

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

官方解释:
Return a new RDD by applying a function to each partition of this RDD, 
while tracking the index  of the original partition
大白话就是该算子会以当前RDD每个分区为单位,携带分区信息回调一次你传递的方法,最后返回
一个新的RDD,所以该算子是一个Transformations算子
 1.java api定义
	def mapPartitionsWithIndex[R]
	(f: Function2[Integer, Iterator[T], Iterator[R]],
	 preservesPartitioning: Boolean = false): JavaRDD[R]
	f的第一个参数为当前的分区号,第二个参数为当前分区的所有数据集,第三参数为当前分区
	处理后返回的结果数据集,当前RDD数据类型为T,返回后的RDD数据类型为R
	preservesPartitioning默认为false,该参数我们不关心
	代码示例:
	public static void main(String[] args) {
	  SparkConf conf = new SparkConf().setMaster("local").setAppName("test");
	  JavaSparkContext jsc = new JavaSparkContext(conf);
	  JavaRDD<String> rdd1 = jsc.parallelize( Arrays.asList(
	          "spark1", "spark2", "spark3", 
	          "spark4", "spark5", "spark6", 
	          "spark7", "spark8", "spark9"), 
	      3);
	  //创建list用来保存处理后的数据
	  List<String> mapStr = new ArrayList<>();
	  JavaRDD<String> rdd2 = rdd1.mapPartitionsWithIndex(
	  (Function2<Integer, Iterator<String>, Iterator<String>>) (index, iterator) -> {
	   System.out.println();
	   if (mapStr.size() > 0) {
	    mapStr.clear();
	   }
	   while (iterator.hasNext()) {
	    String next = iterator.next();
	    String subfix = "";
	    //需求:如果是0号分区在数据前添加'北京区'标记,1号添加'上海区'标记,其他的添加'广州区'标记
	    if (index == 0) {
	     subfix = "【北京区】";
	    } else if (index == 1) {
	     subfix = "【上海区】";
	    } else {
	     subfix = "【广州区】";
	    }
	    mapStr.add(subfix + next);
	   }
	   //注意这里要返回处理后的数据
	   return mapStr.iterator();
	  }, true);
	
	   rdd2.foreach((VoidFunction<String>) s -> {
	    System.out.println(s);
	   });
	  jsc.stop();
	 }
	 运行结果:
	【北京区】spark1
	【北京区】spark2
	【北京区】spark3
	
	【上海区】spark4
	【上海区】spark5
	【上海区】spark6
	
	【广州区】spark7
	【广州区】spark8
	【广州区】spark9
2.scala api定义
	def mapPartitionsWithIndex[U : ClassTag]
	(f: (Int, scala.Iterator[T]) => scala.Iterator[U],
     preservesPartitioning: Boolean = false): RDD[U]
     代码示例:
	def main(args: Array[String]): Unit = {
	  val sparkSession = SparkSession.builder
	   .master("local")
	   .appName("appName")
	   .getOrCreate()
	  val sc = sparkSession.sparkContext
	  val rdd1: RDD[String] = sc.parallelize(List(
	   "spark1", "spark2", "spark3",
	   "spark4", "spark5", "spark6",
	   "spark7", "spark8", "spark9"),
	   3)
	  val rdd2: RDD[String] = rdd1.mapPartitionsWithIndex {
	   (index, iter) => {
	    println()
	    var result = List[String]()
	    var subfix = ""
	    if (index == 0) subfix = "【北京区】"
	    else if (index == 1) subfix = "【上海区】"
	    else subfix = "【广州区】"
	    while (iter.hasNext) {
	     val str: String = iter.next()
	     result = result :+ subfix + str
	    }
	    result.iterator
	   }
	  }
	  rdd2.foreach(println(_))
	  sc.stop()
	 }
	 运行结果:
	【北京区】spark1
	【北京区】spark2
	【北京区】spark3
	
	【上海区】spark4
	【上海区】spark5
	【上海区】spark6
	
	【广州区】spark7
	【广州区】spark8
	【广州区】spark9
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值