pyspark导入用户定义的模块或.py文件

时间:2017-04-21 00:41:24

标签: python apache-spark pyspark python-import python-module

我构建了一个python module,我想在我的pyspark应用程序中导入它。

我的包目录结构是:

wesam/
|-- data.py
`-- __init__.py

我的pyspark脚本顶部的简单import wesam会导致ImportError: No module named wesam。我还尝试将其压缩并使用我的代码--py-files作为recommended in this answer发送,但没有运气。

./bin/spark-submit --py-files wesam.zip mycode.py

我还按照this answer的建议以编程方式添加了文件,但我遇到了同样的ImportError: No module named wesam错误。

.sc.addPyFile("wesam.zip")

我在这里缺少什么?

2 个答案:

答案 0 :(得分:35)

事实证明,由于我在client mode中提交我的应用程序,因此我运行spark-submit命令的机器将运行驱动程序,并且需要访问模块文件。

enter image description here

我将模块添加到我提交作业的节点上的PYTHONPATH环境变量中,方法是将以下行添加到我的.bashrc文件中(或在提交作业之前执行)。 / p>

export PYTHONPATH=$PYTHONPATH:/home/welshamy/modules

这解决了这个问题。由于路径位于驱动程序节点上,因此我不必使用--py-files压缩和发送模块,也不必使用sc.addPyFile()

解决任何pyspark模块导入错误问题的关键是了解驱动程序或工作程序(或两者)是否需要模块文件。

重要 如果工作节点需要您的模块文件,则需要将其作为带有--py-files的zip存档传递,并且此参数必须位于.py文件参数之前。例如,请注意这些示例中的参数顺序:

这是正确的:

./bin/spark-submit --py-files wesam.zip mycode.py

这是正确:

./bin/spark-submit mycode.py --py-files wesam.zip

答案 1 :(得分:3)

mycode.py wesam.py 放在相同的路径位置,然后尝试

sc.addPyFile("wesam.py")

可能有效。