我需要计算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 回答
只需
flatMap
和reduceByKey
:收集后会给: