我在scala中有以下实用程序功能:
object MyUtiltity {
def processData(data1: org.apache.spark.rdd.RDD[String], data2: org.apache.spark.rdd.RDD[String],
data3: org.apache.spark.rdd.RDD[String]) = {
function1(data1, data3)
function2(data2, data3)
}
private def function1 {...}
private def function2 {...}
}
在我的主要工作中,我打电话给:
MyUtility.processData(data1, data2, data3)
data3.saveAsTextFile("myOutput")
似乎data3没有通过function2。有没有办法确保在输出data3之前processData中的function1和function2计算完成。
我想我能做到:
object MyUtiltity {
def processData(data1: org.apache.spark.rdd.RDD[String], data2: org.apache.spark.rdd.RDD[String],
data3: org.apache.spark.rdd.RDD[String]): org.apache.spark.rdd.RDD[String]= {
val data3_1 = function1(data1, data3)
val data3_2 = function2(data2, data3_1)
data3_2
}
private def function1: org.apache.spark.rdd.RDD[String]{...}
private def function2: org.apache.spark.rdd.RDD[String]{...}
}
并且做:
MyUtility.processData(data1, data2, data3).saveAsTextFile("myOutput")
但是我不知道在函数中继续返回整个RDD是否是一个好主意......是否有一种明智的方法可以解决这个问题?
答案 0 :(得分:1)
RDD是惰性分布式集合。在您明确地将其保存到某个烫发商店或将其收集在驱动程序上之前,实际上没有任何实现。
因此,对MyUtility.processData(data1, data2, data3)
的整个调用并没有真正执行任何操作。直到你致电saveAsTextFile("myOutput")
。
所以是的,你的第二种方法非常好,通过函数返回RDD实际上是免费的。
答案 1 :(得分:0)
从查看代码看来,您似乎正在尝试修改RDD的内容。在Spark RDD中是可以改变的,而转换将返回一个新的RDD,所以你可能只需要穿过返回值。希望有所帮助!