【发布时间】:2018-11-22 10:26:53
【问题描述】:
我创建了一个 RDD 并从 origin 创建了另一个 RDD,如下所示。
val RDD2 = RDD1.map({
println("RDD1")
....
}).persist(StorageLevel.MEMORY_AND_DISK)
RDD2.foreach({
println("RDD2")
...
})
...so on..
我预计RDD1的进程只会执行一次,因为RDD1是通过persist方法保存在内存或磁盘上的。
但不知何故,“RDD1”打印在“RDD2”之后,如下所示。
RDD1
RDD1
RDD1
RDD1
RDD2
RDD2
RDD2
RDD2
RDD2
RDD1 -- repeat RDD1 process. WHY?
RDD1
RDD1
RDD1
RDD2
RDD2
RDD2
RDD2
RDD2
【问题讨论】:
-
当第一个“RDD1”全部打印出来时,我可以保证RDD1的处理已经完成。它做了两次相同的工作。
-
我猜你最后做了一些
collect动作? spark.apache.org/docs/latest/api/java/org/apache/spark/rdd/… 也返回一个 RDD。 -
@davidshen84 是的,我在代码末尾做了 collectAsMap()
-
对于 RDD1 和 RDD2?请记住 Spark 中的两个主要概念,即转换和动作。在您采取行动之前,转换不会对 RDD 产生任何影响。
标签: apache-spark