RDD的Action是相对Transformation的另一种操作。Transformation代表计算的中间过程,从一个RDD生成新的RDD;而Action代表计算的结束,一次Action调用之后,不再生成新的RDD,结果返回到Driver程序。
鉴于Action具有这样的特点,所以Action操作是不可以在RDD Transformation内部调用的。比如,下面的调用是不允许的:
rdd1.map(x => rdd2.values.count() * x)
Transformation只是建立计算关系,而Action才是实际的执行者。每个Action都会调用SparkContext
的runJob
方法向集群正式提交请求,所以每个Action对应一个Job。比如在count
的实现中,先提交Job去集群上运行,返回结果到Driver程序,然后调用sum
方法获取数量:
/**
* 返回RDD中的元素数RDD
*/
def count(): Long = sc.runJob(this, Utils.getIteratorSize _).sum