我有一个函数,其中我从文本文件中读取数据并计划创建每个键的所有值的字典。我有以下代码片段来实现这一目标:
def concat_helper(a,b):
if(a!= None and b!=None):
print a,b,a.update(b)
return dict(a).update(dict(b))
elif a!=None:
return a
elif b!=None:
return b
rdd_text=sc.textFile(inputdir)
new_rdd = rdd_text.map(lambda x: (item_id_to_idx[str(x.strip().split("\t")[0])],{user_id_to_idx[str(x.strip().split("\t")[1])]:1})).reduceByKey(lambda x,y: concat_helper(x,y)).sortByKey()
rdd_text
文件是以下格式的输入行:
item_id user_id some other tab_separated fields.
item_id_to_idx和user_id_to_idx都是具有用户id到idx(整数)映射的字典。
我想最终创建一个表单的每个项目字典:
1,{5:1,10:1,34:1,...}其中dict(键)内冒号左边的索引代表user_indices,冒号右边的数字代表他们的分数。
我正在尝试reduceByKey但是我得到了很多无值。
我创建的辅助函数是为了克服reduceByKey抛出的NoneType问题。
我收到的输出格式为:
(item_idx, {user_idx:1})
(item_idx2,None)
(item_idx3,None)
...
我怀疑None值是concat_helper
方法中a.update(b)操作的结果。任何人都可以澄清正在发生的事情/建议一个更好的更正确的方法来实现我想要实现的目标吗?
答案 0 :(得分:1)
你的问题就在于:
return dict(a).update(dict(b))
dict.update 始终返回无 - 仅对其副作用有用。
您应该使用:
a.update(b)
return a
如果a和b都是None,则可能需要空字典作为输出:
def concat_helper(a, b):
rval = a or {}
rval.update(b or {})
return rval