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

如何在RDD pyspark上创建同一个键的可能集合和和字典值?,pyspark,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.combin

下面是一个数据示例,我编写了代码,将字典转换为具有相同键的总和字典值

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}]

任何人,请告诉我。

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

导入itertools
d=[冻结集({'112',a',e'}),冻结集({'112',a',e',d'})]
rdd=sc.并行化(d)
def f_项目集(数据):
l=列表()
对于范围(1,len(数据)+1)内的i:
对于itertools.组合中的x(数据,i+1):
l、 附加(x)
返回l
Ck=rdd.map(lambda s:sorted([l代表s中的l])).flatMap(lambda x:f_itemset(x)).map(lambda x:(x,1)).reduceByKey(lambda x,y:x+y)
打印(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),('112',a',e',2),('112',a',d',1),('112',d',e',1)('112',d',e',1)]