2016-11-06 135 views
0

我在pyspark的关键价值地图上苦于基本操作。以下是问题描述:如何根据键值映射中两个不同键的条件组合值?

data = {(1, [2, 3, 4]), (2, [a, b, 3]), (3, [x, y]) } 

我想获取所有未包含在当前值列表中的键的值。结果应该是这样的:

data = {(1, [a, b, x, y]), (2, [x, y]), (3, []) } 

之前甚至过滤的结果,我只是想价值观结合起来,有几个方法:

  1. 将数据发送到一个功能,并创建嵌套的循环转换成数据:失败,因为我不能让我的RDDS使用地图通过数据迭代正常
  2. 迭代:data.map(lambda x: (x[0], x[1].map(lambda a,b: (x[a] + x[b])))):失败,因为该名单没有mapflatMap属性
  3. 利用价值图法:data.flatMapValues(lambda a, b: (data.lookup(a) + data.lookup(b))).

顺便说一句,我是完全新的pyspark所以我的方法可能是天真的,但有没有办法让这些工作还是有,我应该使用不同的方法?

回答

1

我想你想要做的事,如下列:

1)收集的所有值(假设他们会存放在内存如果没有,我不得不想更多):

values = (data.mapValues(lambda x: set(x)) 
       .values() 
       .reduce(lambda x, y: x.union(y)) 
       .collect()) 

2)(大概在值广播值)地图与您的最终名单,结束后

data.mapValues(lambda x: [y for y in values if y not in x]) 

Iterate through data using map: data.map(lambda x: (x[0], x[1].map(lambda a,b: (x[a] + x[b])))): failed as the list doesn't have map or flatMap attributes

关于这一点的简要说明。你想Python bultin map。语法是map(function, sequence)

+0

感谢您的回复!我试过你的方法,看来set对象没有属性collect:AttributeError:'set'对象没有属性'collect'。有没有其他方法可以打印出我们的价值?另外,第二个也有类似的问题,我遇到过:f(self,obj)#使用明确的自我调用未绑定方法 “看起来您正试图广播RDD或引用RDD” – shake

+0

如果我这样做:values2 = sc.broadcast(values)和data.mapValues(lambda x:[y for y in values in if if y not in x])。collect()。我收到一个错误,说明广播对象不可迭代。 – shake

+0

糟糕...你可以跳过“收集”步骤 - 减少照顾它。 检查文档,但我认为它应该是'values2.value'来访问广播变量的实际值(也许我不应该称它为值...)。 – hoyland

相关问题