Проблема с именованием одного файла заключается в том, что он в значительной степени противоречит философии искры. Чтобы включить быструю обработку, Spark должен иметь возможность распараллеливать записи. Для паркетных файлов или других выходов, которые естественно поддерживают параллелизм, это не проблема. В случае файлов .csv мы привыкли работать с одиночными файлами, что приводит к путанице.
Короче говоря, если вы не используете .coalesce(1)
Spark записывает ваши данные в несколько файлов .csv водна папкаПоскольку существует только один раздел, будет только один файл - но с сгенерированным именем. Таким образом, у вас есть два варианта:
- переименовать / переместить файл впоследствии, используя утилиты databricks или обычные библиотеки python
- . Собрать результат и сохранить его, используя другие библиотеки (по умолчанию будет
csv
пакет)
Очевидный вопрос, который у вас может возникнуть, заключается в том, почему так сложно сделать что-то столь простое, как сохранение в один файл - и ответ таков, потому что это проблема для Spark. Проблема с вашим подходом к сохранению одного раздела заключается в том, что если у вас больше данных, чем может поместиться в памяти вашего драйвера / исполнителя, перераспределение на 1 раздел или collect
передача данных исполнителю просто приведет к сбою и взрыву с исключением.
Для безопасного сохранения в одном файле .csv вы можете использовать метод toLocalIterator
, который загружает в память только один раздел за раз, а в своем итераторе сохраните результаты в одном файле с помощью пакета csv
. .