Apache spark Spark应用中RDD元素的保存

Apache spark Spark应用中RDD元素的保存,apache-spark,pyspark,rdd,Apache Spark,Pyspark,Rdd,我正在群集上运行spark应用程序。我想对RDD中的每个元素执行一些操作,并将每个元素保存到一个文本文件中 我正在用myRDD呼叫foreach myRDD.foreach(进程) def流程(要素): //一些提取字符串的操作 //并转换成myList myList=。。。 打开(“somefile.txt”、“a+”)作为myfile: 打印“----已保存----” myfile.writelines(myList) 但是,我无法找到somefile.txt,即使我发现打印语句打印时没有

我正在群集上运行spark应用程序。我想对RDD中的每个元素执行一些操作,并将每个元素保存到一个文本文件中

我正在用myRDD呼叫foreach

myRDD.foreach(进程)
def流程(要素):
//一些提取字符串的操作
//并转换成myList
myList=。。。
打开(“somefile.txt”、“a+”)作为myfile:
打印“----已保存----”
myfile.writelines(myList)

但是,我无法找到somefile.txt,即使我发现打印语句打印时没有任何错误/警告。somefile.txt保存在哪里?如果我的方法不正确,如何保存RDD的各个元素?

好的,所以这是有问题的原因是RDD不一定在单个节点上。调用
foreach
时的RDD分布在节点上。您需要使用
collect
将RDD收集到驱动程序节点,或者

collect
可能更好,但也会出现瓶颈,因为现在所有数据都被收集到单个节点(驱动程序节点)中

编辑:我将用一些代码回答您的其他问题

def过程(元素):
#将进程元素添加到列表中
返回myList
def写列表(myList):
将open('somefile.txt','a+')作为f:
f、 writelines(myList)
#大体上
myListRDD=myRDD.map(进程)
myListRDD.collect().foreach(writeList)
这应该在高效的同时做你想做的事情。因为我们为列表处理一个新的RDD,所以我们能够并行地进行所有处理,所以唯一的线性操作是文件写入,这需要在单个节点上进行,以实现数据一致性。

myRDD.map(convertToList).saveAsTextFile()
myRDD.map(convertToList).saveAsTextFile(<hdfs output path>)
通过这种方法,您将能够扩展应用程序,如果您必须将所有数据传输到驱动程序中,那么您将保证输出数据足够小,可以放入驱动程序内存,否则您将开始遇到问题

如果您要求所有数据只在一个文件中结束,那么(这种方法的问题与将所有输出传输到驱动程序类似,不可扩展):

myRDD.map(generateList).coalesce(1.saveAsTextFile)()
如果在将列表存储到文件中之前需要将其转换为字符串,则:

myRDD.map(generateList).map(listToString).saveAsTextFile(<hdfs output path>)
myRDD.map(generateList.map(listToString.saveAsTextFile)()

显然,您可以将列表转换为第一个映射内的字符串,并保存一个额外步骤。

是的,如何在驱动程序节点中收集myList?@vkb您只需执行
val myRDDArr=myRDD.collect()
这将把所有RDD数据拉入存储在驱动程序节点上的
myRDDArr
中的数组中。每个元素都被传递到一个函数“进程”,我在该函数上执行返回列表的特定操作。我的最终目标是将列表保存在文本文件中。那么,您是指myRDD.foreach(process.collect()?@vkb该进程对RDD的每个元素都有效吗?如果是这样,我们可以执行
val myListRDD=myRDD.map(process)
并确保process返回您需要保存的列表。然后
myListRDD.collect().foreach(writeData)
这将允许并行处理。因此,只需从
进程
函数中删除文件写入,并将其放入新函数
writeData
即可。。这里的问题是执行foreach,通过函数保存会将元素保存在不清楚的位置。。这也是我最初的问题我想用foreach保存我的列表?有可能吗。。如果没有,那么如何对RDD上的每个元素执行操作,并以列表的形式保存生成的输出。。
myRDD.map(generateList).map(listToString).saveAsTextFile(<hdfs output path>)