pyspark数据帧到HDFS保存了太多文件

时间:2018-03-19 21:52:07

标签: apache-spark pyspark hdfs pyspark-sql

我正在汇总数据,并希望将结果保存在HDFS中。我的最终结果只有6行和2列的数据。但是,当我将其保存到HDFS时,它可以保存200多个文件;我假设是某种类型的预处理。当我查看文件时,它们也都是空白的。

results = aggregate.filter(aggregate["count"] > 2500)

results.show()
+--------------+-----+
|          c_ip|count|
+--------------+-----+
| 198.51.100.61| 2619|
|  203.0.113.33| 2635|
|198.51.100.211| 2668|
|198.51.100.121| 2723|
|198.51.100.176| 2518|
| 198.51.100.16| 2546|
+--------------+-----+

results.write.format("csv").save("/sparkcourse/results")

如何保存到HDFS,以便获得包含这些结果的文件?显然,这些数据适用于一个文件。

我尝试的另一件事是使用.collect(),但随后它将我的数据转换为列表,并且无法通过该选项获取任何内容。

results = aggregate.filter(aggregate["count"] > 2500).collect()

1 个答案:

答案 0 :(得分:0)

Spark 只要处理中出现,就会将数据重新分区为200个分区。 只要需要将数据从一个节点传输到另一个节点或执行器之间,就会发生混乱。因此,当您保存数据框(已有200个分区)时,将为每个分区创建200个文件,并写入一些元数据文件。

因此,您的问题的解决方案是使用coalesce(1)函数,以便一个工作节点写入this answer

中提到的输出路径
results.coalesce(1).write.format("csv").save("/sparkcourse/results")

或者您可以使用repartition(1)作为

results.repartition(1).write.format("csv").save("/sparkcourse/results")