在Pyspark Shell中访问用户定义的模块(ModuleNotFoundError:未命名模块)

时间:2020-01-02 12:52:43

标签: python apache-spark pyspark zip

通常,我们对zip文件spark-submit --name App_Name --master yarn --deploy-mode cluster --archives /<path>/myzip.zip#pyzip /<path>/Processfile.py进行 spark-submit ,并使用dir1.dir2.dir3.module_name import module_name从py文件访问它们,并且模块导入工作正常

当我尝试在pyspark shell中执行相同操作时,它给了我一个模块未找到错误。 pyspark --py-files /<path>/myzip.zip#pyzip

如何在spark shell中访问模块。

2 个答案:

答案 0 :(得分:1)

您可以按以下方式在pyspark shell中的“ spark” Spark会话变量下使用spark上下文

spark.sparkContext.addPyFile('Path to your file')

根据spark-docs,此功能支持带有python代码的.py或.zip依赖项。

 |  addPyFile(self, path)
 |      Add a .py or .zip dependency for all tasks to be executed on this
 |      SparkContext in the future.  The C{path} 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

答案 1 :(得分:0)

最终能够将模块导入Pyspark shell中,我传递的ZIP将所有依赖项模块安装到Python的虚拟环境中并制成ZIP。

因此,在这种情况下,虚拟化然后启动Pyspark shell可以解决问题。

source bin/activate
pyspark --archives <path>/filename.zip

这也不需要我将pyfile添加到sparkContext中。