Azure Databricks中Python模块导入失败问题求助
Azure Databricks Python模块导入问题解决方案
问题根源
sys.path.append添加路径属于会话级操作,集群重启后Python进程重置,sys.path会恢复默认值,之前的修改自然失效。spark.sparkContext.addPyFile仅适合分发单个脚本文件,若你导入的是utils.some_util这类包结构(要求utils目录下存在__init__.py),单独添加单个.py文件无法识别包层级,导致导入失败。
可行解决方案
1. 直接使用工作区绝对路径导入(推荐)
Azure Databricks支持从Workspace路径直接导入标准Python包(每个目录需包含__init__.py,空文件即可)。假设你的目录结构如下:
/Workspace/Repos/Github Repo/sparkling-to-databricks/ └── src/ └── utils/ ├── __init__.py └── some_util.py
无需修改sys.path,直接用绝对路径导入:
from src.utils.some_util import *
2. 通过集群初始化脚本配置全局路径
若要让集群每次启动自动添加目标路径,无需在笔记本重复编写sys.path.append,可通过初始化脚本实现:
- 创建初始化脚本(例如
add_workspace_path.sh),内容如下:
echo "/Workspace/Repos/Github Repo/sparkling-to-databricks/src" >> /databricks/python/lib/python3.9/site-packages/workspace_paths.pth
注意替换python3.9为集群实际使用的Python版本(如3.8、3.10)。
- 将脚本上传至DBFS,然后在集群配置的高级选项 > 初始化脚本中添加该脚本的DBFS路径(例如
dbfs:/databricks/init_scripts/add_workspace_path.sh)。
集群每次启动时,目标路径会被永久添加至Python全局路径,所有会话均可直接导入模块。
3. 利用Databricks Repos自动路径特性
若代码是通过Databricks Repos克隆的GitHub仓库,且在Repos目录下打开笔记本运行,Databricks会自动将当前Repo根目录加入sys.path。例如笔记本位于/Workspace/Repos/Github Repo/sparkling-to-databricks/notebooks,则/Workspace/Repos/Github Repo/sparkling-to-databricks会被自动添加,此时可直接导入:
from src.utils.some_util import *
这种方式无需手动配置,集群重启后依然有效。
4. 正确使用addPyFile(适用于临时场景)
若要使用addPyFile处理包结构,需先将整个src/utils目录打包为ZIP文件并上传至DBFS,再执行分发:
spark.sparkContext.addPyFile("dbfs:/path/to/utils.zip") from some_util import *
打包后直接导入模块名即可,无需包路径,因为ZIP文件会被加入sys.path。但该方式仅适合临时分发单个模块的场景。
内容的提问来源于stack exchange,提问作者Tarique
相关产品推荐
相关产品推荐

