如何在RDD pyspark上创建相同键的可能的集合和总和字典值?

时间:2018-08-27 02:36:30

标签: pyspark

下面有一个数据样本,我写了代码将字典转换为具有相同键的总和字典值。

import itertools
d = [frozenset({'112', 'a', 'e'}), frozenset({'112', 'a', 'e', 'd'})]
rdd = sc.parallelize(d)

def f_itemset(data):    
   d = {}
   for i in range(1, len(data)+1):
        for x in itertools.combinations(data, i+1):                 
            if x not in d:
                d[x] += 1
            else:
                d[x] = 1

    return d
Ck = rdd.map(lambda s: sorted([l for l in s])).map(lambda x: [f_itemset(x))
print(Ck.collect())

输出如下所示。

[{('112', 'a'): 1, ('112', 'e'): 1, ('a', 'e'): 1, ('112', 'a', 'e'): 1}, {('112', 'a'): 1, ('112', 'd'): 1, ('112', 'e'): 1, ('a', 'd'): 1, ('a', 'e'): 1, ('d', 'e'): 1, ('112', 'a', 'd'): 1, ('112', 'a', 'e'): 1, ('112', 'd', 'e'): 1, ('a', 'd', 'e'): 1, ('112', 'a', 'd', 'e'): 1}]

但是,我希望输出是:

[{('112', 'a'): 2, ('112', 'e'): 2, ('a', 'e'): 2, ('112', 'a', 'e'): 2,  ('112', 'd'): 1, ('a', 'd'): 1, ('d', 'e'): 1, ('112', 'a', 'd'): 1, ('112', 'd', 'e'): 1, ('a', 'd', 'e'): 1, ('112', 'a', 'd', 'e'): 1}]

请任何人告诉我。

1 个答案:

答案 0 :(得分:0)

我省略了一些初始声明,并添加了另一个reduceByKey方法来实现计数。不幸的是,默认情况下,只能使用reduceByKey处理列表。如果您真的想坚持使用字典,则必须创建自己的减少方法。否则,此代码可以为您提供帮助。

import itertools
d = [frozenset({'112', 'a', 'e'}), frozenset({'112', 'a', 'e', 'd'})]
rdd = sc.parallelize(d)

def f_itemset(data):    
   l = list()
   for i in range(1, len(data)+1):
       for x in itertools.combinations(data, i+1):                 
           l.append(x)
return l
Ck = rdd.map(lambda s: sorted([l for l in s])).flatMap(lambda x: f_itemset(x)).map(lambda x: (x,1)).reduceByKey(lambda x,y: x+y)

print(Ck.collect())

结果:

[(('112', 'e'), 2), (('a', 'd', 'e'), 1), (('112', 'd'), 1), (('112', 'a'), 2), (('a', 'e'), 2), (('112', 'a', 'd', 'e'), 1), (('a', 'd'), 1), (('d', 'e'), 1), (('112', 'a', 'e'), 2), (('112', 'a', 'd'), 1), (('112', 'd', 'e'), 1)]