首页 文章

RDD上的reduceByKey由键值对列表组成?

提问于
浏览
0

我需要计算RDD中出现元素的数量 . 如果我只是在RDD中有字母计数,这将很容易:

rdd = sc.parallelize([("a", 1), ("b", 1), ("a", 3)])
rdd.reduceByKey(lambda a,b: a+b).collect()  #prints [('a', 4), ('b', 1)]

但是数据的每个元素都来自推文,这意味着每个元素中都会有几个字母的实例,如下所示:

rdd2 = sc.parallelize([[("a", 2), ("b", 1), ("c", 3)], [("a", 5), ("b", 2)]])

什么是将其组合到key / val元组的分布式数据集中的有效方法,其中key = letters和val =总出现次数?

我考虑过的解决方案:

  • 首先将每个元素转换为一个字母列表,然后使用lambda a,b:a b减少,然后创建一个Counter . 这可以工作,但是一个数据被发送到驱动程序节点,并且Counter在那里本地构建 .

  • 将每个元素转换为类似{"a":2,"b":1}的dict,编写一个组合dicts的方法,并使用它减少 . 我不相信如果我只是在汇编方法中将dict a中的项添加到dict b,我完全理解我会得到什么样的行为 . b)我可以解决这个问题,即在合并器方法中创建一个新的dict,但这意味着在减少时会反复创建非常大的字典 .

任何帮助将不胜感激 .

1 回答

  • 1

    只需 flatMapreduceByKey

    rdd2.flatMap(lambda x: x).reduceByKey(lambda x, y: x + y)
    

    收集后会给:

    [('b', 3), ('c', 3), ('a', 7)]
    

相关问题