Scala / Spark在输出结果之前等待一个函数完成

时间:2015-06-05 20:25:20

标签: scala apache-spark static-methods rdd

我在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是否是一个好主意......是否有一种明智的方法可以解决这个问题?

2 个答案:

答案 0 :(得分:1)

RDD是惰性分布式集合。在您明确地将其保存到某个烫发商店或将其收集在驱动程序上之前,实际上没有任何实现。

因此,对MyUtility.processData(data1, data2, data3)的整个调用并没有真正执行任何操作。直到你致电saveAsTextFile("myOutput")

所以是的,你的第二种方法非常好,通过函数返回RDD实际上是免费的。

答案 1 :(得分:0)

从查看代码看来,您似乎正在尝试修改RDD的内容。在Spark RDD中是可以改变的,而转换将返回一个新的RDD,所以你可能只需要穿过返回值。希望有所帮助!