在 Pyspark Shell 中访问用户定义的模块(ModuleNotFoundError: No module named)
Posted
技术标签:
【中文标题】在 Pyspark Shell 中访问用户定义的模块(ModuleNotFoundError: No module named)【英文标题】:Accessing the user defined modules in Pyspark Shell (ModuleNotFoundError: No module named) 【发布时间】:2020-01-02 12:52:43 【问题描述】:通常我们使用 zip 文件 spark-submit --name App_Name --master yarn --deploy-mode cluster --archives /<path>/myzip.zip#pyzip /<path>/Processfile.py
进行 spark-submit 并使用 from dir1.dir2.dir3.module_name import module_name 在 py 文件中访问它们,并且模块导入工作正常。
当我尝试在 pyspark shell 中做同样的事情时,它给了我一个找不到模块的错误。 pyspark --py-files /<path>/myzip.zip#pyzip
如何在 spark shell 中访问模块。
【问题讨论】:
【参考方案1】:您可以使用 pyspark shell 中“spark”Spark 会话变量下可用的 spark 上下文,如下所示
spark.sparkContext.addPyFile('Path to your file')
根据 spark-docs .py 或 .zip 依赖于 python 代码。
| addPyFile(self, path)
| Add a .py or .zip dependency for all tasks to be executed on this
| SparkContext in the future. The Cpath passed can be either a local
| file, a file in HDFS (or other Hadoop-supported filesystems), or an
| HTTP, HTTPS or FTP URI.
|
| .. note:: A path can be added only once. Subsequent additions of the same path are ignored.
下面是使用zip后成功的导入和函数调用
>>> sc.addPyFile('D:\pyspark_test.zip')
>>> import test
>>> test
<module 'test' from 'C:\\Users\\AppData\\Local\\Temp\\spark-f4559ba6-0661-4cea-a841-55d7550d809d\\userFiles-062f5965-e5df-4d26-b2cd-daf7613df56a\\pyspark_test.zip\\test.py'>
>>> test.print_data()
hello
>>>
确保您的 zip 文件结构如下。创建 zip 时选择模块中的所有单个文件,然后创建一个 zip,而不是选择模块文件夹然后创建 zip 文件
└───pyspark_test
test.py
_init_.py
【讨论】:
我确实尝试了这个***.com/a/39779271/6304472,但我仍然找不到模块,请您添加更多关于如何访问模块的信息。我可以测试一些工作代码?/home/user/package/local/lib/python3.6/dist-packages/common/process/filename.py
在公用文件夹下我有以下文件,类似地,子目录进程与 filename.py 文件一起具有它们__init__.py __pycache__
即使遵循该过程,问题仍然存在>>> sc.addPyFile('/<path>/myzip.zip')
>>> import filename
Traceback (most recent call last):
`文件“ModuleNotFoundError: No module named 'filename'
from common.process.filename import filename
也试过了,但还是没有成功
选择文件 filename.py 和 init.py 并从中创建一个压缩文件 myzip.zip。
请在 ModuleNotFoundError 之后粘贴完整的错误:【参考方案2】:
最终能够在 Pyspark shell 中导入模块,我传递的 ZIP 将所有依赖模块安装到 Python 中的虚拟环境中并制作为 ZIP。
所以在这种情况下,虚拟化然后启动 Pyspark shell 就可以了。
source bin/activate
pyspark --archives <path>/filename.zip
这也不需要我将 pyfiles 添加到 sparkContext 中。
【讨论】:
以上是关于在 Pyspark Shell 中访问用户定义的模块(ModuleNotFoundError: No module named)的主要内容,如果未能解决你的问题,请参考以下文章
Pyspark:如何处理 python 用户定义函数中的空值
pyspark:用于确定 NaN 或 Null 的用户定义函数不起作用
我创建了一个文件来访问所有全局变量。我无法访问 pyspark-sql 查询中定义的 UDF 中的全局变量