首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >拟火花getattr行为

拟火花getattr行为
EN

Stack Overflow用户
提问于 2015-03-24 19:29:33
回答 1查看 905关注 0票数 1

注意到PySpark的一些奇怪的行为,会感谢你的任何见解。

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

代码语言:javascript
复制
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属性。

所以这个类的对象

代码语言:javascript
复制
class simple():
    def __init__(self,name):
        self.name=name
    def get_value(self):
        self.value = rdd.map(lambda s: getattr(s,self.name)).collect()

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

代码语言:javascript
复制
theAges = simple('age')
theAges.get_value()

但是,这遇到了一个错误,我认为它的中心是lambda表达式中的lambda。这个第二类很好。

代码语言:javascript
复制
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,并将n传递给lambda而不是self.name

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-04-14 06:24:55

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29241230

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档