Как назвать csv-файл после перезаписи в хранилище больших двоичных объектов Azure

#azure #csv #pyspark #databricks

Вопрос:

Я использую блокнот Databricks для чтения и записи файла в одно и то же место. Но когда я пишу в файл, я получаю много файлов с разными именами. Подобный этому:

введите описание изображения здесь

Я не уверен, почему эти файлы создаются в указанном мной расположении. Кроме того, после выполнения операции записи был создан еще один файл с именем «new_location».

введите описание изображения здесь

Я хочу, чтобы после чтения файла из хранилища больших двоичных объектов Azure я записал файл в то же место с тем же именем, что и оригинал, в то же место. Но я не могу этого сделать. пожалуйста, помогите мне, поскольку я новичок в Pyspark, я уже смонтирован, и теперь я читаю хранилище файлов CSV в контейнере хранилища blob-объектов azure. Перезаписанный файл создается с именем «part-00000-tid-84371752119947096-333f1e37-6fdc-40d0-97f5-78cee0b108cf-31-1-c000.csv»

Код:

 df = spark.read.csv("/mnt/ndemo/nsalman/addresses.csv", inferSchema = True)
df = df.toDF("firstName","lastName","street","town","city","code")
df.show()
file_location_new = "/mnt/ndemo/nsalman/new_location"
# write the dataframe as a single file to blob storage
df.write.format('com.databricks.spark.csv') 
  .mode('overwrite').option("header", "true").save(file_location_new)
 

Ответ №1:

Spark сохранит частичный csv-файл для каждого раздела вашего набора данных. Чтобы сгенерировать один csv-файл, вы можете преобразовать его в фрейм данных pandas, а затем записать его.

Попробуйте изменить эти строки:

 df.write.format('com.databricks.spark.csv') 
  .mode('overwrite').option("header", "true").save(file_location_new)
 

к этой строке

 df.toPandas().to_csv(file_location_new, header=True)
 

Возможно, вам потребуется добавить "/dbfs/" , чтобы file_location_new это сработало.

Вот минимальный автономный пример, демонстрирующий, как написать csv-файл с помощью pandas:

 df = spark.createDataFrame([(1,3),(2,2),(3,1)], ["Testing", "123"])
df.show()
df.toPandas().to_csv("/dbfs/"   "/mnt/ndemo/nsalman/"   "testfile.csv", header=True)
 

Комментарии:

1. file_location_new = «/mnt/ndemo/nsalman/new_location» # преобразуйте его в фрейм данных pandas, а затем запишите его df = df.toPandas().to_csv(«/dbfs/» file_location_new, заголовок=True) df.запись.формат («com.databricks.spark.csv»). режим («перезапись»). опция («заголовок», «правда»). сохранить(file_location_new) Я сделал это, но это дает мне ошибку: ошибка атрибута: объект ‘NoneType’ не имеет атрибута ‘toPandas’

2. Вы уверены, что df-это фрейм данных spark? Я обновил свой ответ, чтобы быть более точным в том, какие строки следует изменить.