如何在RDD pyspark上创建相同键的可能的set和sum字典值?

问题描述 投票:0回答:1

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

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

请有人告诉我。

pyspark
1个回答
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)]
© www.soinside.com 2019 - 2024. All rights reserved.