соединяя два словаря и сохраняя их в RDD - PullRequest
0 голосов
/ 28 июня 2019

У меня есть словарь users с 1748 элементами как (показывая только первые 12 элементов) -

defaultdict(int,
            {'470520068': 1,
             '2176120173': 1,
             '145087572': 3,
             '23047147': 1,
             '526506000': 1,
             '326311693': 1,
             '851106379': 4,
             '161900469': 1,
             '3222966471': 1,
             '2562842034': 1,
             '18658617': 1,
             '73654065': 4,})  

и другой словарь partition с 452743 элементами как (показывая первые 42 элемента) -

{'609232972': 4,
 '975151075': 4,
 '14247572': 4,
 '2987788788': 4,
 '3064695250': 2,
 '54097674': 3,
 '510333371': 0,
 '34150587': 4,
 '26170001': 0,
 '1339755391': 3,
 '419536996': 4,
 '2558131184': 2,
 '23068646': 6,
 '2781517567': 3,
 '701206260771905541': 4,
 '754263126': 4,
 '33799684': 0,
 '1625984816': 4,
 '4893416104': 3,
 '263520530': 3,
 '60625681': 4,
 '470528618': 3,
 '4512063372': 6,
 '933683112': 3,
 '402379005': 4,
 '1015823005': 2,
 '244673821': 0,
 '3279677882': 4,
 '16206240': 4,
 '3243924564': 6,
 '2438275574': 6,
 '205941266': 3,
 '330723222': 1,
 '3037002897': 0,
 '75454729': 0,
 '3033154947': 6,
 '67475302': 3,
 '922914019': 6,
 '2598199242': 6,
 '2382444216': 3,
 '1388012203': 4,
 '3950452641': 5,}

Все ключи в users (все уникальные) находятся в partition и также повторяются с разными значениями (а также partition содержит некоторые дополнительные ключи, которые не используются нами).То, что я хочу, - это новый словарь final, который соединяет ключи users, совпадающие с ключами partition, со значениями partition, т.е. если у меня есть '145087572' в качестве ключа вusers и один и тот же ключ был повторен дважды или трижды в partition с разными значениями, такими как: {'145087572': 2, '145087572': 3, '145087572': 7} , тогда я долженполучить все эти три элемента в новом словаре final.Также я должен сохранить этот словарь как ключ: значение СДР.
Вот что я попробовал:

user_key=list(users.keys())  
final=[]
for x in user_key:
    s={x:partition.get(x) for x in partition}
    final.append(s)  

После запуска этого кода мой ноутбук перестает отвечать (код все еще показывает [*]) иЯ должен перезапустить его.Могу ли я знать, что есть проблема с моим кодом и более эффективный способ сделать это.

1 Ответ

0 голосов
/ 28 июня 2019

Первый словарь не может содержать дубликаты ключей, значение дубликата ключа будет перезаписано последним значением того же ключа.
Теперь давайте проанализируем ваш код

user_key=list(users.keys()) # here you get all the keys say(1,2,3)
final=[]
for x in user_key: #you are iterating over the keys so x will be 1, 2, 3
    s={x:partition.get(x) for x in partition} #This is the reason for halting

''' breaking the above line this is what it looks like.
    s = {} 
    for x in partition:
        s[x] = partition.get(x)
     isn't the outer forloop and inner forloop is using the same variable x
     so basically instead of iterating over the keys of users you are 
     iterating over the keys of partition table, 
     as x is updated inside inner foorloop(so x contains the keys of partition 
     table).
     '''
    final.append(s)

Теперь причина остановки (скажем, у вас есть 10 ключей в словаре пользователя).
поэтому внешний forloop будет повторяться 10 раз и 10 раз
Внутренний цикл будет перебирать целые ключи разделов и делать копию
которая вызывает ошибку памяти, и в конечном итоге ваша система зависает из-за нехватки памяти.
Я думаю, что это будет работать для вас
сохранить данные раздела в python defaultdict (list)

from collections import defaultdict
user_key = users.keys()
part_dict = defaultdict(list)
# partition = [[key1, value], [key2, value], ....] 
# store your parition data in this way (list inside list)
for index in parition:
    if index[0] not in part_dict:
        part_dict[index[0]] = index[1]
    else:
        part_dict[index[0]].append(index[1])
# part_dict = {key1:[1,2,3], key2:[1,2,3], key3:[4,5],....}
final = []
for x in user_keys:
   for values in part_dict[x]:
       final.append([x, values])
       # if you want your result of dictionary format(I don't think it's required) then you ca use
       # final.append({x:values})
       # final = [{key1: 1}, {key2: 2}, ....]
# final = [[key1, 1], [key1, 2], [key1, 3], .....]

Приведенный выше код не проверен, могут потребоваться незначительные изменения

...