Pyspark(键,值)对(键,[值列表])

时间:2017-09-15 21:24:54

标签: python python-2.7 pyspark

让我们假设,我在Spark中有一个键值对,如下所示。

[ (Key1, Value1), (Key1, Value2), (Key1, Vaue3), (Key2, Value4), (Key2, Value5) ]

现在我想减少这个,就像这样。

[ (Key1, [Value1, Value2, Value3]), (Key2, [Value4, Value5]) ]

即,从Key-Value到Key-List of Values。

如何在python中使用map和reduce函数呢?

3 个答案:

答案 0 :(得分:1)

这就是map和reduce的用途!首先将所有值设为长度列表,然后按键减少。这是一个经过测试的例子:

pane.add(label, 0, 0, 2, 1);

答案 1 :(得分:0)

>>> rdd = sc.parallelize([("a1","b1","c1","d1","e1"), ("a2","b2","c2","d2","e2")])

>>> result = rdd.map(lambda x: (x[0], list(x[1:])))

>>> print result.collect()
[('a1', ['b1', 'c1', 'd1', 'e1']), ('a2', ['b2', 'c2', 'd2', 'e2'])]

lambda x的解释:(x [0],list(x [1:])):

x [0]将使第一个元素成为输出的第一个元素

x [1:]将使除第一个元素外的所有元素都在第二个元素中

list(x [1:])将强制其为列表,因为默认值为元组

答案 2 :(得分:-1)

使用mapreduce这样做肯定是可能的,但肯定是混淆的练习。迭代地执行它很容易:

lists={}       # key -> list of values
output=[]
for k,v in input:
  l=lists.get(k)
  if l is None:
    l=lists[k]=[]
    output.append((k,l))  # empty for now
  l.append(v)

备注(因为仅从一个示例中获取要求很难):

  1. 这假设密钥为hashable
  2. 它支持[(k1,v1),(k2,v2),(k1,v3)]等列表,其中并非所有k1对都相邻。
  3. 按首次出现顺序将密钥放入output列表。
  4. 它将所有值(包括重复项)按其出现的顺序排列。