我尝试从循环内的另一个RDD迭代联合生成RDD,但是如果我对循环内的结果RDD执行操作,结果将独占。
var rdd : RDD[Int] = sc.emptyRDD
for ( i <- 1 to 5 ) {
val rdd1 = sc.parallelize(Array(1))
rdd = rdd ++ rdd1
}
// rdd.foreach(println) => void
for ( i <- 1 to 5 ) {
val rdd1 = sc.parallelize(Array(1))
rdd = rdd ++ rdd1
rdd.foreach(x=>x)
}
// rdd.foreach(println) => ( 1,1,1,1,1)
如果我在循环外创建rdd1
,一切正常但不在内部。
是否存在解决此问题的特定轻量级操作?
答案 0 :(得分:0)
要记住的一件事是,当您将foreach
操作应用于RDD时,该操作适用于每个单独的工作人员。因此,在第一种情况下,如果您检查每个执行程序的stdout
,您将找到rdd
的打印值。如果您希望将这些值打印到控制台,可以在驱动程序中聚合RDD(或其子集)的元素,然后应用您的函数(例如rdd.collect.foreach(println)
,rdd.take(3).foreach(println)
,等)。