为什么RDD.getNumPartitions和RDD.mapPartitions的结果不同?



我试图理解为什么我在这两种方法之间划分计数的结果不同:

val rdd: RDD[Int] = sparkSession.sparkContext.parallelize(0 to 9)
println("S1---> " +rdd.getNumPartitions )
val partitionSizes: Array[Int] = rdd.mapPartitions(iter => Iterator(iter.length)).collect()
partitionSizes.foreach((row: Int) => {
println("S2---> " +row )
})

这是我的结果:

S1---> 1

S2---> 10

为什么?

所以,这里发生了一些事情。

缺省值。并行度设置为 1。不知道如何,但运行很少 资源。您可以看到,S1---> 1 表示 1 分区,并且 S2--->10 在 1 个分区中声明 10 个项目。似乎加起来。

使用数据砖笔记本,请注意:

val rdd: RDD[Int] = spark.sparkContext.parallelize(0 to 9)
println("S1---> " +rdd.getNumPartitions )
//S1---> 8
sc.defaultParallelism
//res9: Int = 8, confirms S1 answer
val partitionSizes: Array[Int] = rdd.mapPartitions(iter => Iterator(iter.length)).collect()
//partitionSizes: Array[Int] = Array(1, 1, 1, 2, 1, 1, 1, 2); the 8 partitions and their count
// Print of the above simply, per row
partitionSizes.foreach((row: Int) => {
println("S2---> " +row )
})
// Count of items per partition
S2---> 1
S2---> 1
S2---> 1
S2---> 2
S2---> 1
S2---> 1
S2---> 1
S2---> 2

所以,这里有两件事 ->分区数和 每个分区计数。标题不太正确。

最新更新