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

时间:2018-02-07 14:48:56

标签: apache-spark pyspark

我需要计算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。这样可以工作,但是会向驱动程序节点发送数据,并在那里构建计数器。
  • 将每个元素转换为类似{“a”:2,“b”:1}的dict,编写一个组合dicts的方法,并使用它减少。我有点担心这个因为a)dicts通常在Python中通过引用传递而且我不相信我完全理解如果我只是在组合方法中将dict a中的项添加到dict b中我会得到什么样的行为。 b)我可以解决这个问题,即在合并器方法中创建一个新的dict,但这意味着在缩小时会反复创建非常大的字典。

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:2)

只需flatMapreduceByKey

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

会给出:

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