pyspark - 将多个输入文件合并为一个RDD和一个输出文件

时间:2016-02-24 16:56:28

标签: python hadoop apache-spark mapreduce pyspark

我在Python中有一个wordcount,我希望在Spark上运行多个文本文件并获得一个输出文件,因此这些单词在所有文件中都被计算在内。我尝试了一些解决方案,例如找到herehere的解决方案,但它仍然提供与输入文件数相同数量的输出文件。

rdd = sc.textFile("file:///path/*.txt")
input = sc.textFile(join(rdd))

rdd = sc.textFile("file:///path/f0.txt,file:///path/f1.txt,...")
rdds = Seq(rdd)
input = sc.textFile(','.join(rdds))

rdd = sc.textFile("file:///path/*.txt")
input = sc.union(rdd)

不能工作。任何人都可以建议如何制作一些输入文本文件的RDD?

提前致谢...

1 个答案:

答案 0 :(得分:8)

这应该加载与模式匹配的所有文件。

rdd = sc.textFile("file:///path/*.txt")

现在,您不需要进行任何联合。你只有一个RDD。

来到你的问题 - why are you getting many output files。输出文件的数量取决于partitionsRDD的数量。当您运行字数统计逻辑时,您生成的RDD可以有多个分区。如果要将RDD保存为单个文件,请使用coalescerepartition只有一个分区。

以下代码适用于Examples

rdd = sc.textFile("file:///path/*.txt")
counts = rdd.flatMap(lambda line: line.split(" ")) \
...              .map(lambda word: (word, 1)) \
...              .reduceByKey(lambda a, b: a + b)

counts.coalesce(1).saveAsTextFile("res.csv")