关于调用foreach之前必须调用collect的原因?

分享 未结
0 0 1 9
action825 2019-04-18发布
收藏 点赞

刚开始学习Scala,在书上看到一个例子

val num1=Array(100,80,70)

val rddnum1=sc.parallelize(num1)

val mapRdd=rddnum1.map(_*2)

mapRdd.collect.foreach(println)

这里有个疑问

collect 和 foreach 都是RDD的action函数

collect()    返回RDD所有元素

foreach(func)  对RDD每个元素都是使用特定函数

那我直接对 RDD函数调用foreach不行吗,为什么要先调用collect,再调用foreach呢?

我测试了下,确实不加collect是不会出来结果的,这个是什么原因呢

scala> mapRdd.foreach(println)

                                         

scala> mapRdd.collect.foreach(println)

200

160

140


回帖
  • 2019-04-19

    RDD的map和foreach方法并不是在Driver节点上执行的,而是在Executor节点上执行,所以方法内的println内容最终输出在Driver节点的标准输出上。collect方法会将RDD的所有内容收集至Driver节点,所以可以在本地正常输出。但是需要注意的是,如果RDD很大,collect方法会导致内存溢出,要慎用。

    1 回复