从rdd上的函数返回一个列表

时间:2016-12-02 06:13:42

标签: scala apache-spark

我被困在一些愚蠢的事情上。我有一个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元素的列表。我该怎么做?

1 个答案:

答案 0 :(得分:3)

您的代码存在的问题是Spark会对函数中使用的所有变量的副本进行操作。因此,对变量的更新不会传播回驱动程序,您可以在其中定义列表。有关详细信息,请参阅here

要将RDD的所有元素收集到列表中,请考虑aggregate()操作。 假设您有一个字符串的RDD,那么您的解决方案将如下所示:

rdd.aggregate(List[String]())((list, element) => element :: list, _ ++ _)