Azure ML中Spark DataFrame输出Parquet至数据湖的问题求助
解决方案:Azure ML中Spark DataFrame写入ADLS Parquet格式
问题根源
你遇到的java.io.IOException: Mkdirs failed to create file:/test/.parquet/_temporary/...错误,核心原因有两点:
- 用了本地文件系统路径格式(
/prediction/test/.parquet),但Azure ML的Spark集群无法写入本地文件系统,且目标是数据湖,必须使用ADLS专用路径协议。 - 路径命名错误:Spark写入Parquet时会生成包含多份数据文件的目录,而非单个文件,你不需要在路径末尾加
.parquet后缀,否则会导致Spark尝试创建非法的文件目录结构。
正确实现步骤
1. 配置Spark集群访问ADLS权限
在Azure ML中给Spark集群配置ADLS访问权限,可任选一种方式:
- 服务主体:在Spark配置中添加以下参数:
fs.azure.account.auth.type、fs.azure.account.oauth.provider.type、fs.azure.account.oauth2.client.id、fs.azure.account.oauth2.client.secret、fs.azure.account.oauth2.client.endpoint。 - 托管标识(MSI):给Azure ML计算集群启用系统分配MSI,同时在ADLS容器中赋予该MSI「存储Blob数据参与者」权限。
- 账户密钥:在Spark配置中添加
fs.azure.account.key.<存储账户名>.dfs.core.windows.net参数,值为ADLS存储账户密钥。
2. 使用正确的ADLS路径格式
必须采用abfss协议的路径,格式如下:
abfss://<容器名>@<存储账户名>.dfs.core.windows.net/<目标子路径>
3. 修正后的写入代码示例
调整路径格式并移除多余的.parquet后缀,代码和Databricks语法一致:
# 替换为你的ADLS存储账户名和容器名 storage_account = "your-storage-account" container = "your-container" output_directory = "prediction/test" # 构建正确的ADLS路径 output_path = f"abfss://{container}@{storage_account}.dfs.core.windows.net/{output_directory}" # 写入Parquet文件 dummy.write.mode("overwrite").parquet(output_path)
关键注意事项
- 路径末尾不要加
.parquet:Spark会自动在目标目录下生成多个.parquet数据文件及元数据文件。 - 写入模式选择:
mode("overwrite")会覆盖目标目录所有内容,如需追加数据可改为mode("append")。 - 验证结果:可通过Azure存储浏览器或Azure ML数据资产查看生成的Parquet目录及文件。
内容的提问来源于stack exchange,提问作者userrrr
相关产品推荐
相关产品推荐

