密钥,[值列表]到密钥,[值的组合]在Spark中

时间:2016-09-14 11:43:38

标签: apache-spark pyspark

我是Spark Python的新手。我试图转换为获取键的值列表的组合。但我被卡住了。

让我说我的配对RDD是(Key,List []):

(a,[1,2,3])
(b,[2,3])

现在我需要将其转换为(键,组合(List []))

(a,[1])
(a,[2])
(a,[3])
(a,[1,2])
(a,[1,3])
(a,[1,2,3])
.
.
.

我尝试过这样做,但失败了:

def combis(l,n):
  l = [item for sublist in l for item in sublist]
  return combinations(l,n)

combiusershobby = hobbyusers.flatMap(lambda (a,b) : (a,combis(b,2))

其中combis采用两个参数,组合中列出值和没有值。我返回列表清单。

如何实现这一目标?

1 个答案:

答案 0 :(得分:3)

简单明了:

from functools import partial
from itertools import combinations

rdd = sc.parallelize([("a",[1,2,3]), ("b",[2,3])])
combs = rdd.flatMapValues(partial(combinations, r=2))

combs.take(3)
## [('a', (1, 2)), ('a', (1, 3)), ('a', (2, 3))]

或者如果你想要所有:

from itertools import chain 

combs_one_to_n = rdd.flatMapValues(lambda vs: chain(*[
    combinations(vs, i) for i in range(1, len(vs) + 1)]
))

combs_one_to_n.take(5)
## [('a', (1,)), ('a', (2,)), ('a', (3,)), ('a', (1, 2)), ('a', (1, 3))]