我是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)))
答案 0 :(得分:1)
TL; DR 如果您需要驱动程序的结果,请使用map
后跟collect
。
map将函数应用于RDD中的每个元素。
map [U](f:(T)⇒U)(隐式arg0:ClassTag [U]):RDD [U] 通过将函数应用于此的所有元素来返回新的RDD RDD。
在您的情况下,T
为Array[Array[String], Long]
且U
为ListBuffer[Array[Int]]
。如果您有一个函数f
来执行T
类型元素的转换,那么map
就是您的朋友。