首页 > 解决方案 > 为什么我可以从 Azure Blob 存储读取但无法写入?

问题描述

因为我无法将镶木地板文件写入 Azure Blob 存储,所以我把头撞在墙上。在我的 Azure Databricks Notebook 上,我基本上: 1. 从与数据帧相同的 blob 存储读取 CSV 并 2. 尝试将数据帧写入相同的存储。

我能够读取 CSV,但是当我尝试编写镶木地板文件时出现此错误。

这是堆栈跟踪:

由于阶段故障而中止作业:阶段 8.0 中的任务 0 失败 4 次,最近一次失败:阶段 8.0 中丢失任务 0.3(TID 20、10.139.64.5、执行程序 0):shaded.databricks.org.apache.hadoop.fs。 azure.AzureException: java.io.IOException at shaded.databricks.org.apache.hadoop.fs.azure.AzureNativeFileSystemStore.storeEmptyFolder(AzureNativeFileSystemStore.java:1609) ... ... 引起:com.microsoft.azure.storage .StorageException:指定的资源不存在。

这是我的python代码:

spark.conf.set("fs.azure.sas.my_container.my_storage.blob.core.windows.net", dbutils.secrets.get(scope = "my_scope", key = "my_key"))

读取 csv

df100 = spark.read.format("csv").option("header", "true").load("wasbs://my_container@my_storage.blob.core.windows.net/folder/revenue.csv") 

写实木复合地板

df100.write.parquet('wasbs://my_container@my_storage.blob.core.windows.net/f1/deh.parquet')  

结尾

标签: pythonazure-blob-storageazure-databricks

解决方案


有效的方法涉及通过其 URL 直接写入 Azure blob 存储容器。当然,使用这种方法,您不必将容器挂载到 DBFS。

下面是用于将 CSV 数据直接写入 Azure Databricks Notebook 中的 Azure Blob 存储容器的代码片段。

# 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
(dataframe
 .coalesce(1)
 .write
 .mode("overwrite")
 .option("header", "true")
 .format("com.databricks.spark.csv")
 .save(output_blob_folder))

# Get the name of the wrangled-data CSV file that was just saved to Azure blob storage (it starts with 'part-')
files = dbutils.fs.ls(output_blob_folder)
output_file = [x for x in files if x.name.startswith("part-")]

# Move the wrangled-data CSV file from a sub-folder (wrangled_data_folder) to the root of the blob container
# While simultaneously changing the file name
dbutils.fs.mv(output_file[0].path, "%s/predict-transform-output.csv" % output_container_path)

有关更多详细信息,请参阅“如何将数据从 Azure Databricks 笔记本写入 Azure Blob 存储容器”。

希望这可以帮助。


推荐阅读