【发布时间】:2018-02-07 22:52:31
【问题描述】:
我需要计算 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} 这样的字典,编写一个方法来组合字典,并使用它进行归约。我对此有点担心,因为 a) dicts 通常在 Python 中通过引用传递,我不相信我完全理解如果我只是在组合器方法中将 dict a 中的项目添加到 dict b 会得到什么行为. b) 我可以在组合方法中创建一个新的字典,但这意味着在减少时重复创建非常大的字典。
任何帮助将不胜感激。
【问题讨论】:
标签: apache-spark pyspark