我是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采用两个参数,组合中列出值和没有值。我返回列表清单。
如何实现这一目标?
答案 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))]