Python / Azure выходное имя файла - PullRequest
0 голосов
/ 01 октября 2019

Я новичок в Azure и Python и создаю записную книжку из блоков данных для вывода результатов кусочка sql. Приведенный ниже код создает ожидаемый вывод, но с именем файла по умолчанию длиной около 100 символов. Я хотел бы иметь возможность дать выводу разумное имя и добавить дату / время для создания уникальности, что-то вроде testfile20191001142340.csv. Я поднялся высоко и низко и не могу найти ничего, что могло бы помочь, надеясь, что кто-то в сообществе может указать мне правильное направление

%python
try:
  dfsql = spark.sql("select * from dbsmets1mig02_technical_build.tbl_Temp_Output_CS_Firmware_Final order by record1") #Replace with your SQL
except:
  print("Exception occurred")
if dfsql.count() == 0:
  print("No data rows")
else:
  dfsql.coalesce(1).write.format("com.databricks.spark.csv").option("header","false").option("delimiter","|").mode("overwrite").option("quote","\u0000").save(
"/mnt/publisheddatasmets1mig/metering/smets1mig/cs/system_data_build/firmware/outbound/")   

1 Ответ

0 голосов
/ 01 октября 2019

Проблема с именованием одного файла заключается в том, что он в значительной степени противоречит философии искры. Чтобы включить быструю обработку, Spark должен иметь возможность распараллеливать записи. Для паркетных файлов или других выходов, которые естественно поддерживают параллелизм, это не проблема. В случае файлов .csv мы привыкли работать с одиночными файлами, что приводит к путанице.

Короче говоря, если вы не используете .coalesce(1) Spark записывает ваши данные в несколько файлов .csv водна папкаПоскольку существует только один раздел, будет только один файл - но с сгенерированным именем. Таким образом, у вас есть два варианта:

  1. переименовать / переместить файл впоследствии, используя утилиты databricks или обычные библиотеки python
  2. . Собрать результат и сохранить его, используя другие библиотеки (по умолчанию будет csv пакет)

Очевидный вопрос, который у вас может возникнуть, заключается в том, почему так сложно сделать что-то столь простое, как сохранение в один файл - и ответ таков, потому что это проблема для Spark. Проблема с вашим подходом к сохранению одного раздела заключается в том, что если у вас больше данных, чем может поместиться в памяти вашего драйвера / исполнителя, перераспределение на 1 раздел или collect передача данных исполнителю просто приведет к сбою и взрыву с исключением.

Для безопасного сохранения в одном файле .csv вы можете использовать метод toLocalIterator, который загружает в память только один раздел за раз, а в своем итераторе сохраните результаты в одном файле с помощью пакета csv. .

...