reduceByKey()dict无法正常工作

时间:2015-05-08 19:24:02

标签: dictionary mapreduce apache-spark nonetype pyspark

我有一个函数,其中我从文本文件中读取数据并计划创建每个键的所有值的字典。我有以下代码片段来实现这一目标:

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)操作的结果。任何人都可以澄清正在发生的事情/建议一个更好的更正确的方法来实现我想要实现的目标吗?

1 个答案:

答案 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