在Python中使用foreach遍历Spark RDD
我正在尝试把一个非常大的 RDD(弹性分布式数据集)从集群中写入一个 .csv 文件。这个 RDD 太大了,使用 .collect() 方法会出错,所以我想把 RDD 分成几块,分别在每个节点上保存,然后再把它们合在一起,因为顺序并不重要。我想用 foreach 方法配合 CSV 打印功能,这样每一部分就可以写出它的值,然后我可以手动把这些部分合在一起,可能通过 FTP 传输。
我有一些 Spark 的使用经验,但到目前为止,我还没能让 RDD 的 foreach 方法做出什么有用的事情。当我尝试运行文档中给出的示例时,
>>> def f(x): print x
>>> sc.parallelize([1, 2, 3, 4, 5]).foreach(f)
我在控制台上什么也没看到。我认为这是因为 'print' 操作是在不同的节点上执行的,而不是在控制台所在的 namenode 上。不过,如果是这样的话,我真的看不出 foreach 方法有什么用处!
我该如何在不先调用 collect() 方法的情况下,把 foreach 的结果返回到 namenode 呢?
另外,我也愿意尝试使用 saveAsTextFile() 这个 RDD 方法,但同样我也没能让它正常工作!它似乎创建了一个文件夹,而不是一个文本文件,可能是因为这些文件在每个节点上都存在,而不是集中在一起?