向Spark传递函数
注意当你传递的对象是某个对象的成员,或者包含了对某个对象中一个字段的引用时(如self.field),Spark就会把整个对象发送到工作节点,这可能比你想要传递的东西大得多。
#-*- coding:utf-8 -*-
class SearchFunctions(object):
def __init__(self,query):
self.query = query
def isMatch (self,s):
return self.query in s
def getMatchesFunctionReference(self,rdd):
#问题:在rdd.filter self.isMatch 中引用了整个self
return rdd.filter(self.isMatch)
def getMatchesMemberReference(self,rdd):
#问题:在self.query中引用了整个self
return rdd.filter(lambda x:self.query in x)
应改正为:传递一个不带字段引用的python 函数
#-*- coding:utf-8 -*-
class SearchFunctions(object):
...
def getMatchesNoReference(self,rdd):
# 安全:只把需要的字段提取到局部变量中
query = self.query
return rdd.filter(lambda x:query in x)