如何在RDD中的每个元素上执行函数并连接输出?

时间:2017-12-07 08:48:08

标签: scala apache-spark rdd

我是Spark的新手,我使用的是Spark 1.6.0。

我的RDD是:RDD[Array[Array[String], Long]]

我想通过一个以Array[Array[String], Long]作为输入并返回ListBuffer[Array[Int]]作为输出的函数来运行RDD中的每个元素。

RDD中每个元素的计算可以并行完成,它们不相互依赖。但是,一旦RDD的所有元素都通过该函数运行,我想将所有ListBuffer[Array[Int]]输出一起加入一个ListBuffer[Array[Int]](此处的顺序也不相关,但它们应该都在同一个数据结构中。)

最好的方法是什么?我可以预先知道RDD并通过该函数运行它们,但是我不知道如何处理输出,然后在驱动程序中执行此合并。

这对累加器来说似乎是可能的。前面提到的功能不仅仅是一行代码,它就像20多行。所以,如果我们有这个功能:

def func(data: Array[Array[String], Long]): ListBuffer[Array[Int]] {
    // create ListBuffer
    // iterate over data
        // do some operations on an element in data
        // add some entry to the ListBuffer
    // add the ListBuffer to the Accumulator or return ListBuffer?
}

我怎么能把这一切都包起来?我可以这样做:

// create Accumulator
// RDD.foreach() // call the func and pass Accumulator as argument?

或者:

val accum = // a ListBuffer[Array[Int]] accumulator
RDD.foreach(x => accum.add(func(x)))

1 个答案:

答案 0 :(得分:1)

TL; DR 如果您需要驱动程序的结果,请使用map后跟collect

map将函数应用于RDD中的每个元素。

  

map [U](f:(T)⇒U)(隐式arg0:ClassTag [U]):RDD [U] 通过将函数应用于此的所有元素来返回新的RDD RDD。

在您的情况下,TArray[Array[String], Long]UListBuffer[Array[Int]]。如果您有一个函数f来执行T类型元素的转换,那么map就是您的朋友。