【问题标题】:reduceByKey on RDD consisting of lists of key-value pairs?RDD上的reduceByKey由键值对列表组成?
【发布时间】: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


    【解决方案1】:

    只需flatMapreduceByKey

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

    收集到的会给出:

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

    【讨论】:

      猜你喜欢
      • 2015-12-09
      • 1970-01-01
      • 2016-01-15
      • 2016-06-24
      • 1970-01-01
      • 2014-09-23
      • 2016-08-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多