Azure Databricks运行SparkFiles报路径不存在错误 社区版正常如何解决
问题原因
Azure Databricks与Databricks community的部署架构差异是报错的核心原因:
- Databricks社区版为单节点部署,Driver和Executor进程运行在同一台服务器上,
SparkFiles.addFile()下载的文件在本地路径全局可见,加file://前缀可以正常读取。 - Azure Databricks为分布式集群部署,
SparkFiles.addFile()只会将文件同步到所有Executor节点的本地临时目录,你使用file://前缀读取时,Spark默认会在当前执行任务的节点找文件,跨节点访问就会触发路径不存在错误。
可行解决方案
方案1:直接读取公共API(最简便)
Spark原生支持直接读取HTTP公开接口数据,不需要借助SparkFiles能力,修改代码如下即可直接运行:
cnae = 'https://servicodados.ibge.gov.br/api/v2/cnae/subclasses' cnaeDF = spark.read.option("multiLine", True).option("mode", "PERMISSIVE").json(cnae)
方案2:保留SparkFiles的修改方式
如果业务逻辑必须使用SparkFiles能力,改为在Driver端读取本地文件后再转换为DataFrame,规避分布式节点本地路径不通的问题:
import json from pyspark import SparkFiles cnae = 'https://servicodados.ibge.gov.br/api/v2/cnae/subclasses' spark.sparkContext.addFile(cnae) # Driver端直接读取本地同步的文件 with open(SparkFiles.get("subclasses"), "r", encoding="utf-8") as f: cnae_data = json.load(f) # 转换为Spark DataFrame cnaeDF = spark.createDataFrame(cnae_data)
额外排查点
如果修改后仍有路径不存在报错,可以打印SparkFiles.get("subclasses")的返回值,确认当前环境下下载的文件名是否被自动重命名,部分环境会对无后缀的URL下载资源自动追加后缀,对应调整get方法的入参即可。
内容的提问来源于stack exchange,提问作者Welder
相关产品推荐
相关产品推荐

