如何控制从Spark DataFrame写入的输出文件的数量?

时间:2018-06-05 13:25:00

标签: scala apache-spark apache-kafka apache-spark-sql spark-streaming

使用Spark流来从Kafka主题中读取Json数据 我使用DataFrame来处理数据,后来我希望将输出保存到HDFS文件中。问题是使用:

df.write.save("append").format("text")

产生许多文件,有些文件很大,有些甚至是0字节。

有没有办法控制输出文件的数量?另外,要避免"反对"问题,是否还有一种方法可以限制每个文件的大小,以便在当前达到特定大小/行数时将新文件写入?

2 个答案:

答案 0 :(得分:2)

输出文件的数量等于Dataset的分区数。这意味着您可以通过多种方式控制它,具体取决于上下文:

  • 对于没有广泛依赖关系的Datasets,您可以使用读者特定参数控制输入
  • 对于具有广泛依赖关系的Datasets,您可以使用spark.sql.shuffle.partitions参数控制分区数。
  • 独立于血统,你可以coalescerepartition
  

有没有办法限制每个文件的大小,以便在当前达到特定大小/行数时将新文件写入?

没有。内置编写器严格按1:1的关系。

答案 1 :(得分:1)

您可以使用尺寸估算器:

import org.apache.spark.util.SizeEstimator
val size  = SizeEstimator.estimate(df)

接下来,您可以根据数据框的大小调整文件数量,并使用repatition或coalesce