在 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__ 即使遵循该过程,问题仍然存在&gt;&gt;&gt; sc.addPyFile('/&lt;path&gt;/myzip.zip') &gt;&gt;&gt; import filenameTraceback (most recent call last):`文件“”,第1行,在中`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 中应用用户定义的聚合函数的替代方法

Pyspark:如何处理 python 用户定义函数中的空值

pyspark:用于确定 NaN 或 Null 的用户定义函数不起作用

我创建了一个文件来访问所有全局变量。我无法访问 pyspark-sql 查询中定义的 UDF 中的全局变量

尝试通过数据框在 Pyspark 中执行用户定义的函数时出错

如何访问安装在 hdfs 头节点集群内的 pyspark