1

注意到 PySpark 的一些奇怪行为,将不胜感激任何见解。

假设我有一个由简单元素组成的 RDD

from collections import namedtuple
Animal = namedtuple('Animal', ('name','age'))
a = Animal('jeff',3)
b = Animal('mike',5)
c = Animal('cathy',5)
rdd=sc.parallelize([a,b,c])

现在我有兴趣在一个简单的类中捕获该 RDD 的不同属性,例如使用从每个元素rdd.map(lambda s: getattr(s,'name'))中提取属性。name

所以这个类的对象

class simple():
    def __init__(self,name):
        self.name=name
    def get_value(self):
        self.value = rdd.map(lambda s: getattr(s,self.name)).collect()

将设置它们并从 RDD 中name获取相应的值。values

theAges = simple('age')
theAges.get_value()

但是,这遇到了一个我认为集中在self.name表达式中lambda的错误。第二节课效果很好

class simple2():
    def __init__(self,name):
        self.name=name
    def get_value(self):
        n=self.name
        self.value = rdd.map(lambda s: getattr(s,n)).collect() 

我添加的只是前面的调用n=self.name并传递nlambda而不是self.name.

那么我们无法评估的问题是self.name什么lambda?我在纯 python 中创建了类似的情况(self.name在 alambda中)并且没有错误,所以我认为这是特定于 Spark 的。谢谢你的想法。

4

1 回答 1

1

这是由于 pyspark 无法在类实例上创建闭包。n在范围内分配get_value允许 Spark 发送腌制函数,包括相当于对象属性的别名。到目前为止,似乎解决方案只是在函数范围内分配类属性(但不要指望它们会改变!)

于 2015-04-14T06:24:55.770 回答