将每个RDD中的每个元素存储到新列表

时间:2017-09-30 07:46:39

标签: scala apache-spark

我正在尝试将每个rdd中的每个元素存储到一个新列表中。我可以打印元素,但我可以不在列表中存储元素,甚至可以使用字符串变量。

以下是代码:

...
    var hashtags = joined_d.map(x => ((x._1, x._2._1._1, x._2._2, 
    x._2._1._4), 
    getHashTags(x._2._1._4))).
    transform(rdd => rdd.map{case (x, list) => if(list.length > 0) 
    list.map(k => (k, (x._1, x._2, x._3, x._4, 1))) 
    else List((x._1.toString, (x._1, x._2, x._3, x._4, 0))) })

现在,当存储元素时,如:

    val arr = new ArrayBuffer[String]();
    var hashtags_pair = hashtags.foreachRDD(rdd => 
    rdd.foreach(l => l.foreach(x =>  arr += x._1)))

然后打印值:

arr.foreach(println) // Not working

但是当直接打印值而不存储时,它会像:

var hashtags_pair = hashtags.foreachRDD(rdd => 
rdd.foreach(l => l.foreach(x => println(x._1))) // It's working

1 个答案:

答案 0 :(得分:1)

否则您无法将地图的输出存储在数组中。原因是RDD是一个分布式数据集,它并行执行不同执行程序中的map操作。现在,驱动程序仅将执行映射操作的闭包发送给执行程序。

这里声明的数组变量是驱动程序的本地变量,不能发送给所有执行程序。