将类函数传递给 PySpark RDD

Posted

技术标签:

【中文标题】将类函数传递给 PySpark RDD【英文标题】:Passing class functions to PySpark RDD 【发布时间】:2015-09-14 16:33:01 【问题描述】:

我在 Python 文件中有一个名为 some_class() 的类:

/some-folder/app/bin/file.py

我在这里将它导入到我的代码中:

/some-folder2/app/code/file2.py

import sys
sys.path.append('/some-folder/app/bin')
from file import some_class

clss = some_class()

我想在 spark 的映射中使用这个类的名为 some_function 的函数

sc.parallelize(some_data_iterator).map(lambda x: clss.some_function(x))

这给了我一个错误:

No module named file

当我在 pyspark 的 map 函数之外调用 class.some_function 时,即通常但不在 pySpark 的 RDD 中。我认为这与pyspark有关。我不知道我哪里错了。

我试过直播这堂课,但还是不行。

【问题讨论】:

【参考方案1】:

所有 Python 依赖项必须要么存在于工作节点的搜索路径上,要么使用 SparkContext.addPyFile 方法手动分发,所以这样的事情应该可以解决问题:

sc.addPyFile("/some-folder/app/bin/file.py")

它将文件复制到所有工作人员并放置在工作目录中。

请注意不要使用file 作为模块名称,即使它只是一个示例。在 Python 中隐藏内置函数并不是一个好主意。

【讨论】:

有没有办法将文件夹添加到路径而不是单个文件 addPyFile 可以采用zip 文件。您可以压缩整个源代码树,然后使用 addPyFile 添加它。

以上是关于将类函数传递给 PySpark RDD的主要内容,如果未能解决你的问题,请参考以下文章

无法将类成员函数传递给另一个函数(std::thread::thread)

试图将类作为参数传递给不同的类构造函数,但出现“转换”错误

如何将类成员函数传递给 3rd 方库中的方法?

Pyspark 将函数作为参数传递给 UDF

我可以将类引用作为参数传递给 VB Net 中的函数吗?

如何将参数传递给不带字符串的函数(Pyspark)