我正在尝试将每个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
答案 0 :(得分:1)
否则您无法将地图的输出存储在数组中。原因是RDD是一个分布式数据集,它并行执行不同执行程序中的map操作。现在,驱动程序仅将执行映射操作的闭包发送给执行程序。
这里声明的数组变量是驱动程序的本地变量,不能发送给所有执行程序。