如何通过 pyspark 正确使用 rdd.map 中的模块

Posted

技术标签:

【中文标题】如何通过 pyspark 正确使用 rdd.map 中的模块【英文标题】:How to correctly use modules in rdd.map with pyspark 【发布时间】:2018-09-24 11:37:12 【问题描述】:

正如标题所示,我正在尝试创建外部模块,然后在一个简单的rdd.map 函数中导入和调用这些模块。下面是一个例子:

## main.py ##
myrdd = spark.sparkContext.parallelize([1,2,3,4,5])
spark.sparkContext.addPyFile("myModule.py")

import myModule as mm

myrdd.map(lambda x: mm.Module.test(x)).collect()

## myModule.py ##
class Module():
    def test(self,x):
       return x * 2

当尝试使用 spark submit 运行它时,我收到以下错误:

test() missing 1 required positional argument: 'x'

有人能指出错误吗?

非常感谢

【问题讨论】:

test 是一种方法,而不是类方法。你不能像这样使用它,因为它需要 self 作为第一个参数。这是 python 错误,不是 pyspark 错误。 【参考方案1】:

test() 不是类方法,所以不能直接调用 Module.test(x)。

改为创建一个 Module 对象并在其上调用 test() 方法,如下所示:

myrdd = spark.sparkContext.parallelize([1,2,3,4,5])
spark.sparkContext.addPyFile("myModule.py")
import myModule as mm

myrdd.map(lambda x: mm.Module().test(x)).collect()
[2, 4, 6, 8, 10]

【讨论】:

以上是关于如何通过 pyspark 正确使用 rdd.map 中的模块的主要内容,如果未能解决你的问题,请参考以下文章

在 PySpark 中使用 rdd.map 解压和编码字符串

如何使用 Pyspark 将一个 rdd 映射到另一个?

Dataframe.rdd.map().collect 在 PySpark 中不起作用 [重复]

pyspark rdd map 没有调用函数

如何在pyspark的JSON文件中选择正确的值

pyspark MLlib踩坑之model predict+rdd map zip