Это известная проблема в Spark. Каждый раздел будет выводить один файл независимо от фактического размера данных. coalesce
тоже не серебряная пуля - нужно быть очень осторожным с новым количеством разделов - слишком маленьким, и приложение будет OOM. Вы можете рассчитать вычисление объединенного значения во время выполнения, но в большинстве случаев это будет означать сохранение данных на диске, получение фактического размера и повторное чтение и coalesce
до оптимального размера.
В вашем простом примере вы можете получить фактический размер ввода заранее. Но для общего случая есть такие инструменты, как FileCrush , которые работают с вашим выводом (небольшими файлами) и объединяют их в меньшее количество файлов. Но теперь он старый и основан на map-Reduce (все еще работает, хотя). В моей команде мы создали очень простую версию Spark, и вы можете легко создать свою собственную. Если вы это сделаете, не забудьте учитывать кодеки сжатия при расчете оптимального количества разделов.
Также вы правильно беспокоитесь о параллелизме при использовании coalesce
. Если это становится проблемой, и у вас есть некоторые вычисления, которые должны выполняться на более высоком уровне параллелизма до coalesce
, вы можете использовать что-то вроде spark.createDataFrame(df.rdd, df.schema)
, чтобы создать новый фрейм данных и избежать слишком сильного опускания coalesce
, Однако это имеет важные последствия, которые вам необходимо учитывать.