源码
RDD.scala
//各个分区在Executor端统计,driver聚合
def count(): Long = sc.runJob(this, Utils.getIteratorSize _).sum
Utils.scala
//该方法调用的是迭代器,读一条加一条。而不是全部数据加载进内存去计数
def getIteratorSize(iterator: Iterator[_]): Long = {
var count = 0L
while (iterator.hasNext) {
count += 1L
iterator.next()
}
count //返回该分区的数量
}
源码实现
val rdd1: RDD[Int] = sc.parallelize(List(1, 2, 3, 5, 67, 7889, 87987, 34, 3245, 643),3)
println(rdd1.count())
// todo count的底层实现
// 1.得到三个分区对应的数量
val array: Array[Long] = sc.runJob(rdd1, (iter: Iterator[Int]) => {
var count = 0L
while (iter.hasNext) {
count += 1L
iter.next()
}
count
})
array.foreach(println)
// 2.数组求和,计算总数
println(array.sum)