Azure Databricks无法读取Wheel包内CSV文件的问题求助
解决Azure Databricks中Wheel包内资源文件路径不存在问题
问题核心
自行开发的motor_ingesta Wheel包包含timezones.csv资源文件,本地Jupyter Notebook调用包内agregaciones.py的aniade_hora_utc函数读取文件正常,但部署到Azure Databricks Notebook后触发FileNotFoundError。已尝试pip安装包、重启集群,环境为Python 3.11、PySpark 3.5、Java 8。
可能原因与解决方案
1. Wheel包未正确打包资源文件
本地开发时能通过相对路径读取文件,但如果setup.py未配置资源打包规则,Wheel包可能未包含timezones.csv,导致Databricks安装后文件缺失。
解决方法:修改setup.py,确保资源文件被打包进Wheel:
from setuptools import setup, find_packages setup( name="motor_ingesta", version="0.1", packages=find_packages(), # 配置包内资源文件 package_data={ "motor_ingesta": ["timezones.csv"] # 替换为你的包名和文件实际路径 }, include_package_data=True, )
重新打包Wheel:
python setup.py bdist_wheel
2. 代码中使用了错误的文件路径获取方式
本地环境的相对路径在Databricks集群中无效,集群的工作目录、包安装路径与本地差异极大,硬编码相对路径必然失败。
解决方法:使用Python标准库获取包内资源的绝对路径,修改agregaciones.py中的文件读取逻辑:
方法一:使用importlib.resources(Python 3.7+推荐)
import importlib.resources import pandas as pd # 或你用来读取CSV的库 def aniade_hora_utc(): # 获取包内资源文件的绝对路径 with importlib.resources.path("motor_ingesta", "timezones.csv") as csv_path: df = pd.read_csv(csv_path) # 后续业务逻辑
方法二:使用pkg_resources(兼容旧版本)
import pkg_resources import pandas as pd def aniade_hora_utc(): csv_path = pkg_resources.resource_filename("motor_ingesta", "timezones.csv") df = pd.read_csv(csv_path) # 后续业务逻辑
3. 验证Databricks中包的安装状态
确认Wheel包在Databricks集群中正确安装且包含目标文件:
- 在Notebook中执行以下命令查看包安装路径:
import motor_ingesta print(motor_ingesta.__file__)
- 根据输出的路径,查看是否存在
timezones.csv:
%sh ls -l /dbfs/FileStore/python/motor_ingesta/ # 替换为实际安装路径
如果文件不存在,重新用%pip install /dbfs/FileStore/path/to/motor_ingesta.whl安装(确保Wheel包已上传到DBFS)。
4. 排查Databricks集群的Python环境一致性
确保集群使用的Python版本与本地一致(Python 3.11):
- 查看集群配置中的"Runtime version",选择包含Python 3.11的Databricks Runtime(如13.3 LTS及以上版本支持Python 3.11)。
- 安装包时指定与集群Python匹配的Wheel,避免跨版本打包导致的路径问题。
内容的提问来源于stack exchange,提问作者Estrella
相关产品推荐
相关产品推荐

