为何在Azure Synapse Notebook写入Blob时仅报‘指定Blob不存在’错误?
解决Azure Synapse Notebook写入Blob存储CSV报404错误的方案
以下是针对「能读取Blob存储同路径文件,但写入新文件时报HTTPError: HTTP Error 404: The specified blob does not exist.」问题的排查和解决步骤:
1. 确认目标虚拟文件夹的存在性
Blob存储中的「文件夹」是虚拟概念,仅当文件夹下存在Blob文件时才会被系统识别。如果要写入的{FOLDER}是新建的,或者原文件夹因所有文件被删除而「消失」,直接写入会触发404错误。
- 解决:先通过Azure Portal、Azure CLI或SDK在容器内创建该虚拟文件夹(上传一个空文件到目标路径即可),或者使用支持自动创建父路径的写入方式(如Spark的
writeAPI、ADLS Gen2的abfss协议)。
2. 验证写入权限
读取文件仅需只读权限,但写入需要存储Blob数据参与者或包含**写入(Write)**权限的自定义角色。
- 解决:在Azure Portal的存储容器IAM权限页,检查Synapse工作区托管身份/使用的服务主体是否拥有目标容器的写入权限,若没有则添加对应角色。
3. 检查路径格式与合法性
- 避免使用
https://直接写入:Synapse中读写Blob存储建议使用wasbs://(通用Blob存储)或abfss://(ADLS Gen2)协议,https://路径通常仅用于读取,不支持写入操作。正确路径示例:# 通用Blob存储 wasbs://{CONTAINER}@{ACCOUNTNAME}.blob.core.windows.net/{FOLDER}/{FILENAME}.csv # ADLS Gen2(启用层级命名空间) abfss://{CONTAINER}@{ACCOUNTNAME}.dfs.core.windows.net/{FOLDER}/{FILENAME}.csv - 检查路径拼写:容器名必须为小写,Blob路径区分大小写,确保
{ACCOUNTNAME}、{CONTAINER}、{FOLDER}无拼写错误;避免路径包含空格、特殊符号(如!@#$%^&*),若必须使用需进行URL编码。
4. 调整写入代码逻辑
若使用Spark Notebook写入
确保使用正确的写入模式和配置,示例代码:
# 假设df是要写入的DataFrame df.write.csv( "wasbs://{CONTAINER}@{ACCOUNTNAME}.blob.core.windows.net/{FOLDER}/{FILENAME}.csv", header=True, # 写入表头 mode="overwrite", # 覆盖已有文件或创建新文件 encoding="utf-8" )
如果需要生成单个CSV文件,可先合并分区:
df.coalesce(1).write.csv(...)
若使用Pandas写入
Pandas默认不支持直接写入https://路径,需借助adlfs或azure-storage-blob库实现,示例:
import pandas as pd from adlfs import AzureBlobFileSystem # 初始化文件系统 fs = AzureBlobFileSystem( account_name="{ACCOUNTNAME}", account_key="{ACCOUNTKEY}" # 或使用SAS token、托管身份认证 ) # 写入CSV with fs.open("{CONTAINER}/{FOLDER}/{FILENAME}.csv", 'w') as f: df.to_csv(f, index=False, header=True)
5. 检查ADLS Gen2层级命名空间(若适用)
若存储账户启用了ADLS Gen2层级命名空间,需使用abfss://协议,并确保身份拥有对目标目录的写入权限(可通过存储资源管理器或IAM配置)。
内容的提问来源于stack exchange,提问作者gertrude89
相关产品推荐
相关产品推荐

