我被困在一些愚蠢的事情上。我有一个rdd x。在这个rdd的每个元素上,我必须调用一个函数f,它从该rdd获取元素并将其添加到列表中。
var list1 = scala.collection.mutable.MutableList[String]()
def listfinal (x:String):scala.collection.mutable.MutableList[String]={
list1 += x
return list1
}
val s = rdd.map(x=>listfinal(x))
print(s.count())
我只想要最后一个列表,其中添加了rdd的所有元素,而不是每个包含rdd元素的列表。我该怎么做?
答案 0 :(得分:3)
您的代码存在的问题是Spark会对函数中使用的所有变量的副本进行操作。因此,对变量的更新不会传播回驱动程序,您可以在其中定义列表。有关详细信息,请参阅here。
要将RDD的所有元素收集到列表中,请考虑aggregate()
操作。
假设您有一个字符串的RDD,那么您的解决方案将如下所示:
rdd.aggregate(List[String]())((list, element) => element :: list, _ ++ _)