使用如下内容的PySpark广播值:
[('b000jz4hqo',{'rom':2.4051362683438153,'clickart': 56.65432098765432,'950':254.94444444444443,'image':3.6948470209339774,'premier':9.27070707070707,'000':6.218157181571815,'dvd':1.287598204264871,'broderbund':22.169082125603865,'pack':2.98180636777128}),('b0006zf55o' ,{'laptops':11.588383838383837,'desktops':12.74722222222222, 'backup':2.8015873015873014,'win':0.501859142607174,'ca': 9.10515873015873,'v11':50.98888888888888,'30u':84.98148148148148,'30pk':254.94444444444443,'desktop':2.23635477582846,'1': 0.3231235037318687,'arcserve':24.28042328042328,'computer':0.6965695203400122,'lap':127.47222222222221,'oem':46.35353535353535,'international':9.44238683127572,'associates':7.284126984126985})]
因此它是一个key->列表广播变量。
尝试将broadcast.value转换为字典会导致
TypeError:不可用类型:'dict'
使用
之类的代码from itertools import izip
amazonWeightsBroadcast = sc.broadcast(amazonWeightsRDD.collect())
i = iter(amazonWeightsBroadcast.value)
amazonWeightsDict = dict(izip(i, i))
也尝试过(给出相同的“不可修改的”错误):
amazonWeightsDict = dict(amazonWeightsBroadcast.value[i:i+2] for i in range(0, len(amazonWeightsBroadcast.value), 2))
因此,如果无法将广播变量转换为字典,那么通过密钥查找值列表的更好的解决方案是什么?
Python 2.7.6 Spark 1.3.1
答案 0 :(得分:0)
我花了一段时间..问题在于如何创建广播变量。 不得不使用.collectAsMap()而不仅仅是.collect() 现在它按预期工作了。