Как записать Spark Dataframe (в DataBricks) в хранилище BLOB-объектов (в Azure)? - PullRequest
0 голосов
/ 26 марта 2020

Я работаю в DataBricks, где у меня есть DataFrame.

type(df) 
Out: pyspark.sql.dataframe.DataFrame

Единственное, что мне нужно, это записать этот полный кадр данных искры в Azure Хранилище BLOB-объектов .

I нашел этот пост. Поэтому я попробовал этот код:

# Configure blob storage account access key globally
spark.conf.set(
  "fs.azure.account.key.%s.blob.core.windows.net" % storage_name,
  sas_key)

output_container_path = "wasbs://%s@%s.blob.core.windows.net" % (output_container_name, storage_name)
output_blob_folder = "%s/wrangled_data_folder" % output_container_path

# write the dataframe as a single file to blob storage
(datafiles
 .coalesce(1)
 .write
 .mode("overwrite")
 .option("header", "true")
 .format("com.databricks.spark.csv")
 .save(output_blob_folder))

Запуск этого кода приводит к ошибке ниже. Смена части "csv" для паркета и других форматов также не удалась.

org.apache.spark.sql.AnalysisException: CSV data source does not support struct<AccessoryMaterials:string,CommercialOptions:string,DocumentsUsed:array<string>,Enumerations:array<string>,EnvironmentMeasurements:string,Files:array<struct<Value:string,checksum:string,checksumType:string,name:string,size:string>>,GlobalProcesses:string,Printouts:array<string>,Repairs:string,SoftwareCapabilities:string,TestReports:string,endTimestamp:string,name:string,signature:string,signatureMeaning:bigint,startTimestamp:string,status:bigint,workplace:string> data type.;

Поэтому мой вопрос (и это должно быть легко - мое предположение): Как я могу записать свой искровой фрейм данных из DataBricks в Azure Blob Storage?

Моя Azure структура папок выглядит следующим образом:

Account = MainStorage 
Container 1 is called "Data" # containing all the data, irrelevant because i already read this in. 
Container 2 is called "Output" # here I want to store my Spark Dataframe. 

Заранее большое спасибо!

РЕДАКТИРОВАТЬ Я использую Python. Однако я не против, если решение на других языках (если DataBricks их поддерживает, например, R / Scala et c.). Если это работает, это прекрасно :-)

1 Ответ

1 голос
/ 29 марта 2020

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

// output_container_path= wasbs://ContainerName@StorageAccountName.blob.core.windows.net/DirectoryName 
val mount_root = "/mnt/ContainerName/DirectoryName"
df.coalesce(1).write.format("csv").option("header","true").mode("OverWrite").save(s"dbfs:$mount_root/") 
...