在Synapse Spark Scala Notebook中无法读取Blob Storage的CSV文件
解决Synapse Notebook读取非Data Lake Gen2 Blob存储CSV文件路径不存在问题
前置配置(Blob存储侧)
- 进入目标Blob存储账户的「访问控制(IAM)」页面,为你使用的Synapse工作区托管标识分配存储Blob数据读取者角色,角色分配范围覆盖待读取的容器即可。
- 若使用SAS令牌访问,直接在Blob存储的「共享访问签名」页面生成对应容器的读取权限SAS,需确保令牌有效期、允许的IP范围覆盖Synapse工作区的运行环境。
Synapse Notebook读取配置
方法1:使用工作区托管标识访问(推荐,无需维护密钥)
首先配置Spark访问权限:
# 替换为实际参数 storage_account_name = "你的Blob存储账户名" tenant_id = "你的Azure租户ID" # 配置托管标识访问规则 spark.conf.set( f"fs.azure.account.oauth.provider.type.{storage_account_name}.blob.core.windows.net", "org.apache.hadoop.fs.azurebfs.oauth2.AzureADAuthenticator" ) spark.conf.set( f"fs.azure.account.oauth2.msi.tenant.{storage_account_name}.blob.core.windows.net", tenant_id )
然后编写CSV读取代码:
# 替换为实际容器名、文件路径 container_name = "待读取的容器名" csv_file_path = "子目录/xxx.csv" full_path = f"wasbs://{container_name}@{storage_account_name}.blob.core.windows.net/{csv_file_path}" # 读取CSV,可根据实际文件调整header、分隔符、编码等参数 df = spark.read.format("csv")\ .option("header", "true")\ .option("inferSchema", "true")\ .option("encoding", "utf-8")\ .load(full_path) # 验证读取结果 df.show(5)
方法2:使用SAS令牌访问
# 替换为实际参数 storage_account_name = "你的Blob存储账户名" container_name = "待读取的容器名" # SAS令牌不要带开头的?符号 sas_token = "你生成的SAS令牌字符串" # 配置SAS访问规则 spark.conf.set( f"fs.azure.sas.{container_name}.{storage_account_name}.blob.core.windows.net", sas_token ) # 读取文件 full_path = f"wasbs://{container_name}@{storage_account_name}.blob.core.windows.net/子目录/xxx.csv" df = spark.read.format("csv").option("header","true").load(full_path) df.show(5)
常见问题排查
- 路径协议错误:非Data Lake Gen2的Blob存储必须使用
wasbs://作为路径前缀,使用abfss://会直接提示路径不存在 - 权限未生效:IAM角色分配后最长需要15分钟同步,刚配置完成可以稍等后再测试
- 路径拼写错误:Blob存储的文件路径大小写敏感,需要和实际存储的路径、文件名完全一致
- SAS令牌错误:检查SAS是否有读取权限、是否已过期、IP限制是否包含Synapse工作区出站IP
内容的提问来源于stack exchange,提问作者Krishna Murthy
相关产品推荐
相关产品推荐

