count操作中:把执行count操作的rdd中所有的partition的数据的总和时行相加,得到一个Long类型的返回值的操作.也就是说这个操作得到一个Long值,这个值当前的这个RDD中每个partition的iterator的总记录条数和.
task的function的定义部分:
这里主要是通过对每个partition中的iterator时行迭代,得到这个iterator的总记录数.
这里的Utils.getIteratorSize就是对这个partition中的iterator进行next并记数的操作.
这里传给task中执行的最终的函数是根据partition中的iterator进行next的操作,每next一下,记录一个count值,到iterator迭代完成后,返回这个count值,就是这个task的返回值.
sc.runJob(this, Utils.getIteratorSize _)
Driver端的resultHandler的定义部分:
val results = new Array[U](partitions.size)
这里把每个task返回的count值先存储到task对应的partition的下标位置 .
(index, res) => results(index) = res
Driver端最终结果的返回部分:
最后,把这个results的数组(数组中每个位置存储了一个count值)进行相加操作.
def count(): Long = sc.runJob(this, Utils.getIteratorSize _).sum