Writestream of spark генерирует множество небольших файлов

Я использую Spark Structured Streaming (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

}

К сожалению, при таком подходе я получаю много маленьких файлов.

Я пытался использовать триггерный подход, чтобы этого избежать, но это тоже не сработало. У вас есть идеи, как с этим справиться, пожалуйста? Большое спасибо

Вы можете подробно объяснить вашу проблему? Сколько файлов создается? с каким интервалом и с какими данными? Вы записываете вывод каждого пакета в файл с помощью потоковой передачи искр? Куда пишутся эти файлы? в HDFS?

Aditya Pawade 11.09.2018 14:06
1
1
955
1

Ответы 1

Причина того, что у вас много маленьких файлов, несмотря на использование курок, может заключаться в том, что ваш фрейм данных имеет много разделов. Чтобы уменьшить паркет до 1 файла / 2 минуты, вы можете объединяться на один раздел перед записью файлов Parquet.

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

Другие вопросы по теме