spark的writeStream生成许多小文件

时间:2018-09-10 09:18:16

标签: scala apache-spark spark-structured-streaming

我正在使用Spark结构化流(2.3)将镶木地板数据写入云中的存储桶(Google Cloud Storage)。 我正在使用以下功能:

def writeStreaming(data: DataFrame, format: String, options: Map[String, String], partitions: List[String]): DataStreamWriter[Row] = {
var dataStreamWrite = data.writeStream .format(format).options(options).trigger(Trigger.ProcessingTime("120 seconds"))

if (!partitions.isEmpty)
  dataStreamWrite = ddataStreamWrite.partitionBy(partitions: _*)

dataStreamWrite

}

不幸的是,通过这种方法,我得到了很多小文件。

为了避免这种情况,我尝试使用触发器方法,但是这种方法也不起作用。您对如何处理有任何想法吗? 非常感谢

1 个答案:

答案 0 :(得分:1)

尽管使用 trigger 却有许多小文件的原因可能是您的数据框具有许多分区。要将实木复合地板减少到1个文件/ 2分钟,可以在写入实木复合地板文件之前 coalesce 到一个分区。

var dataStreamWrite = data
    .coalesce(1)
    .writeStream 
    .format(format)
    .options(options)
    .trigger(Trigger.ProcessingTime("120 seconds"))