Scala/Spark 等待一个函数完成后再输出结果
Scala/Spark wait for one function to complete before output the results
我在 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 是否是个好主意……有没有聪明的方法来解决这个问题?
从代码来看,您似乎在尝试修改 RDD 的内容。在 Spark 中,RDD 是不可变的,相反,转换将 return 一个新的 RDD,因此您可能只需要遍历 return 值。希望对您有所帮助!
RDD 是惰性分布式集合。除非您明确地将其保存到某个 perm 存储区或将其收集到驱动程序中,否则实际上没有任何内容会具体化。
因此,对 MyUtility.processData(data1, data2, data3)
的整个调用实际上并没有执行任何操作。直到您致电 saveAsTextFile("myOutput")
。
所以是的,你的第二种方法非常好,通过函数返回 RDDs 实际上是免费的。
我在 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 是否是个好主意……有没有聪明的方法来解决这个问题?
从代码来看,您似乎在尝试修改 RDD 的内容。在 Spark 中,RDD 是不可变的,相反,转换将 return 一个新的 RDD,因此您可能只需要遍历 return 值。希望对您有所帮助!
RDD 是惰性分布式集合。除非您明确地将其保存到某个 perm 存储区或将其收集到驱动程序中,否则实际上没有任何内容会具体化。
因此,对 MyUtility.processData(data1, data2, data3)
的整个调用实际上并没有执行任何操作。直到您致电 saveAsTextFile("myOutput")
。
所以是的,你的第二种方法非常好,通过函数返回 RDDs 实际上是免费的。