2017-09-15 147 views
0

让我们假设,我在Spark中有一个关键值对,如下所示。Pyspark(key,value)对与(key,[值列表])

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

现在我想减少这种情况,像这样。

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

也就是说,从键值到键值列表。

我该怎么做,使用地图和减少python函数?

+3

我相信这是你正在寻找的:https://stackoverflow.com/a/27002657/8160718 –

回答

-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)]这样的列表,其中并非所有​​对都相邻。
  3. 它按照第一次出现的顺序将密钥放入output列表中。
  4. 它将所有值(包括重复项)按其出现的顺序排列。
+0

这个代码是不适合大量的键,值对,因为你将遍历所有的他们。 –

+0

我不是'pyspark'的专家。我是否应该假设该算法是[在线](https://en.wikipedia.org/wiki/Online_algorithm)? (在Python 2中,'map'和'reduce'不能做到这一点!)如果是这样,我们可以假设所有具有单个键的对都是连续的吗? –

+2

我并不是故意粗鲁。我想说的是,在考虑与Spark有关的问题时,数据集通常很大,并且当您执行上面编写的代码时,它需要调用collect(),以便主节点将需要将所有内容加载到它的内存中是不可行的。 OP意味着Pyspark中的“map”和“reduce”,而不是Python中使用的那些。 –

相关问题