2

我创建了一个 python egg 文件来将我的一些 python 模块导入到 Azure databricks 集群中。

包内的某些文件引用同一包内的其他文件。本地安装,一切正常。当我将包加载到 Azure databricks 并尝试使用我导入的库时,我收到模块导入错误。

例如:module1 看起来像这样

import module2

print('hello, this is module 1')

模块 2 看起来像这样

print('hello, this is module 2')

注意,module1 导入了 module2。Module2 什么都不导入。

我尝试在工作区 py 文件中导入 module1,当我运行该单元格时,出现错误“ImportError: No module named 'module2'”

从我在数据块中的笔记本中,当我运行此代码时:from myLibrary import module1

我收到一个错误:ImportError: No module named 'module2'

如果我运行这个:from myLibrary import module2

它运行良好

我验证了 module2 包含在 egg 包中。我上传了一个除 Azure 数据块之外的所有内容的示例,当然,是到 github GitHub 示例, 这是使用 python3 运行时运行的。

如果需要更多信息来理解问题,请告诉我,我很乐意编辑问题并提供。

4

2 回答 2

1

我怀疑这是一个 pythonpath 问题(并且您正在作为 Python 作业执行)。在模块 1 中,我会添加:

spark = SparkSession.builder.getOrCreate()
spark.sparkContext.addPyFile("dbfs:/path/module2.py")

这将让文件所在的所有节点。

您可以引用包含大量脚本的 zip 文件,而不是 py 文件 - 只需确保它们位于 zip 内的平面单个文件夹结构中。

于 2018-11-30T11:12:10.103 回答
0

呃,我想通了。西蒙,你的回答不正确,但确实投了赞成票,因为它让我思考真正的问题是什么。

有答案是我脑筋急转弯。参考我原来的问题中的示例,我的库中有两个 python 模块,module1 和 module2

模块 2 如下所示:

print('Hi, I'm module 2')

模块 1 看起来像这样:

import module2
print('Hi, I'm module 1')

如果您将 module1 导入 py 文件,您应该会看到:

你好,我是模块 2

你好,我是模块 1

现在,回顾一下 module1 的代码。具体来说,注意我的import语句。这就是问题所在。我的新 py 文件没有 module2 并且 python 解释器显然不会默认查看同一个模块(如果有这样做,请告诉我。我在文档中找不到它)

无论如何,我应该from MyLibrary import module2 通过上传到 databricks 确认正确的导入语句,然后将相同的更改应用于我的实际项目并且一切正常。

于 2018-11-30T19:53:23.827 回答