Как создать возможное заданное и суммированное словарное значение одного и того же ключа в Pyspark RDD - PullRequest
0 голосов
/ 27 августа 2018

У меня есть образец данных ниже, и я написал свой код для преобразования словаря в сумму словарного значения с тем же ключом.

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 голосов
/ 04 сентября 2018

Я пропустил некоторые из ваших начальных утверждений и включил дополнительный метод reduByKey для достижения подсчета.К сожалению, по умолчанию можно обрабатывать списки только с помощью ReduByKey.Если вы действительно хотите придерживаться словарей, вы должны создать собственный метод сокращения.В противном случае вам может помочь этот код.

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)]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...