我已经创建了一个python egg文件,以将我的许多python模块导入Azure databricks群集。
该软件包中的某些文件引用了同一软件包中的其他文件。本地安装,一切正常。 当我将程序包加载到Azure数据块中并尝试使用导入的库时,出现模块导入错误。
例如: module1看起来像这样
import module2
print('hello, this is module 1')
模块2看起来像这样
print('hello, this is module 2')
注意,模块1导入模块2。 Module2不导入任何内容。
我尝试将module1导入工作区py文件中,当我运行该单元格时,出现错误'ImportError:没有名为'module2'的模块
在数据砖中的笔记本上,运行以下代码:from myLibrary import module1
我收到一个错误:ImportError: No module named 'module2'
如果我运行此命令:from myLibrary import module2
运行正常
我确认egg包中包含module2。 我将所有减去Azure数据块的示例都上传到了github GitHub Sample 这是使用python3运行时运行的。
请让我知道是否需要更多信息来理解该问题,我们很乐意编辑并提供该问题。
答案 0 :(得分:1)
我怀疑这是pythonpath问题(并且您正在作为Python Job执行)。在module1中,我要添加:
spark = SparkSession.builder.getOrCreate()
spark.sparkContext.addPyFile("dbfs:/path/module2.py")
这将使文件所在的所有节点都
您可以引用包含很多脚本的zip文件而不是py文件,只需确保它们位于zip文件内的平面单个文件夹结构中即可。
答案 1 :(得分:0)
我知道了。西蒙,你的回答不对,但是投票赞成,因为这让我思考了真正的问题是什么。
答案是我的大脑狭窄。 引用原始问题中的示例,我的库中有两个python模块,分别为module1和module2
module2看起来像这样:
print('Hi, I'm module 2')
module1看起来像这样:
import module2
print('Hi, I'm module 1')
如果将module1导入py文件,则应该看到以下内容:
嗨,我是模块2
嗨,我是模块1
现在,回头看作为module1的代码。具体来说,请注意我的进口声明。那就是问题所在。我的新py文件没有module2,并且python解释器显然没有默认在同一个模块内查找(如果要这样做,请告诉我。我在文档中找不到)< / p>
无论如何,正确的导入语句应该是from MyLibrary import module2
我确认已上传到databricks,然后将相同的更改应用于我的实际项目,并且一切正常。