我正在使用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
}
不幸的是,通过这种方法,我得到了很多小文件。
为了避免这种情况,我尝试使用触发器方法,但是这种方法也不起作用。您对如何处理有任何想法吗? 非常感谢
答案 0 :(得分:1)
尽管使用 trigger 却有许多小文件的原因可能是您的数据框具有许多分区。要将实木复合地板减少到1个文件/ 2分钟,可以在写入实木复合地板文件之前 coalesce 到一个分区。
var dataStreamWrite = data
.coalesce(1)
.writeStream
.format(format)
.options(options)
.trigger(Trigger.ProcessingTime("120 seconds"))