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 实际上是免费的。