spark foreachPartition,如何获取每个分区的索引?

时间:2018-01-22 14:28:39

标签: scala apache-spark

spark foreachPartition,如何获取分区的索引(或序列号,或识别分区的东西)?

val docs: RDD[String] = ...

println("num partitions: " + docs.getNumPartitions)

docs.foreachPartition((it: Iterator[String]) => {
  println("partition index: " + ???)
  it.foreach(...)
})

2 个答案:

答案 0 :(得分:7)

您可以使用TaskContextHow to get ID of a map task in Spark?):

import org.apache.spark.TaskContext

rdd.foreachPartition((it: Iterator[String]) => {
  println(TaskContext.getPartitionId)
})

答案 1 :(得分:4)

不完全相同,但您可以使用RDD.mapPartitionsWithIndex并返回Iterator[Unit]作为结果:

val rdd: RDD[Unit] = docs.mapPartitionsWithIndex { case (idx, it) => 
  println("partition index: " + ???)
  it.foreach(...)
}

但是你必须记住实现RDD

另一种方法是使用mapPartitionsWithIndex执行与转换数据相关的逻辑,然后仅使用foreachRDD从外部发送数据。