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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 12:52:15