You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Azure Synapse PySpark Notebook中JSON写入ADLS Gen2失败求助

解决方案:写入Azure Data Lake Gen2的正确方式

问题根源

  • 原生Python open() 仅支持本地文件系统,无法直接写入ADLS Gen2的HTTP/ABFSS路径,这是触发FileNotFoundError的直接原因。
  • 转DataFrame写入报错通常是数据结构不匹配或ADLS权限/路径配置错误导致。

方案1:使用PySpark写入(推荐,适配你的项目技术栈)

步骤1:配置Spark的ADLS访问权限

初始化Spark会话时,需配置ADLS的认证信息(推荐用服务主体):

from pyspark.sql import SparkSession

spark = SparkSession.builder \
    .appName("WriteToADLS") \
    .config("fs.azure.account.auth.type", "OAuth") \
    .config("fs.azure.account.oauth.provider.type", "org.apache.hadoop.fs.azurebfs.oauth2.ClientCredsTokenProvider") \
    .config("fs.azure.account.oauth2.client.id", "<你的服务主体Client ID>") \
    .config("fs.azure.account.oauth2.client.secret", "<你的服务主体Secret>") \
    .config("fs.azure.account.oauth2.client.endpoint", "https://login.microsoftonline.com/<你的Tenant ID>/oauth2/token") \
    .getOrCreate()

步骤2:将API返回的JSON转为Spark DataFrame

根据API返回的JSON结构调整解析逻辑,示例如下:

from pyspark.sql import Row

# 直接用response.json()得到的字典进行解析
json_data = response.json()
# 假设数据嵌套在'workspaces'字段下,需根据实际返回结构修改
data_rows = [Row(**item) for item in json_data.get('workspaces', [])]

# 创建Spark DataFrame
df = spark.createDataFrame(data_rows)

步骤3:写入ADLS Gen2(ABFSS路径)

使用ABFSS协议路径,格式为abfss://<容器名>@<存储账户名>.dfs.core.windows.net/<文件夹路径>/:

# 写入为单个JSON文件(小数据场景适用;大数据场景建议去掉coalesce(1),保留分区写入)
df.coalesce(1).write \
    .mode("overwrite") \
    .json("abfss://<容器名>@p4syndev.dfs.core.windows.net/<你的文件夹名>/output.json")

方案2:使用Azure Storage SDK直接写入

如果不需要依赖Spark,可使用官方SDK写入:

步骤1:安装依赖

pip install azure-storage-file-datalake

步骤2:写入代码

from azure.storage.filedatalake import DataLakeServiceClient

# 初始化DataLake服务客户端
service_client = DataLakeServiceClient(
    account_url="https://p4syndev.dfs.core.windows.net/",
    credential="<你的服务主体Secret或SAS令牌>"
)

# 获取容器客户端
file_system_client = service_client.get_file_system_client(file_system="<你的容器名>")
# 获取目标目录客户端
directory_client = file_system_client.get_directory_client("<你的文件夹名>")

# 创建文件并写入JSON数据
file_client = directory_client.create_file("output.json")
file_client.upload_data(kantata_json_data, overwrite=True)

常见问题排查

  • 权限问题:确保所用身份(服务主体/用户)拥有ADLS Gen2的Storage Blob Data Contributor权限。
  • 路径格式错误:ABFSS路径必须包含容器名,正确格式为abfss://<容器>@<账户>.dfs.core.windows.net/<路径>。
  • DataFrame结构错误:若转DataFrame报错,先打印json_data的结构,确保嵌套字段被正确展开或提前定义Spark Schema。

内容的提问来源于stack exchange,提问作者DrTaylor

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 16:34:55