【问题标题】:pyspark - multiple input files into one RDD and one output filepyspark - 一个 RDD 和一个输出文件中的多个输入文件
【发布时间】:2016-06-07 02:34:30
【问题描述】:

我在 Python 中有一个字数统计,我想在 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?

提前谢谢...

【问题讨论】:

  • 你能解释一下“不工作”是什么意思吗?
  • 和上面几行意思一样——程序返回的输出文件个数和输入文件的个数一样。

标签: python hadoop apache-spark mapreduce pyspark


【解决方案1】:

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

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

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

回答您的问题 - why are you getting many output files。输出文件的数量取决于RDDpartitions 的数量。当您运行字数统计逻辑时,您生成的 RDD 可以有超过 1 个分区。如果要将 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")

【讨论】:

  • 是不是所有的动作和操作都在几个分区上运行,只有输出合并成一个东西?例如,每个分区(文件)分别计算单词“the”,并且输出文件中的同一个单词会有多个值?如果是 - 也许coalesce() 可以用作第一个或开头的某个地方?...
  • 不,每当您执行操作/转换时,您都会获得新的 RDD。在上述例子中,counts Rdd 是结果 RDD。单词“the”在计数 RDD 中只会出现一次。
  • 您可以查看此演示文稿以了解更多详细信息 - slideshare.net/mobile/mohitgargk/spark-101-58162162
  • 您的解决方案完美运行@Mohitt。谢谢你的介绍。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多