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
相关产品推荐
相关产品推荐

