spark foreachPartition
,如何获取分区的索引(或序列号,或识别分区的东西)?
val docs: RDD[String] = ...
println("num partitions: " + docs.getNumPartitions)
docs.foreachPartition((it: Iterator[String]) => {
println("partition index: " + ???)
it.foreach(...)
})
答案 0 :(得分:7)
您可以使用TaskContext
(How 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
从外部发送数据。