如何通过 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 解压和编码字符串