【问题标题】:How to sum values in an iterator in a PySpark groupByKey()如何对 PySpark groupByKey() 中的迭代器中的值求和
【发布时间】:2015-09-30 17:02:54
【问题描述】:

我正在 Spark (Python) 上迈出第一步,我正在努力处理 groupByKey() 中的迭代器。我无法对这些值求和:我的代码如下所示:

example = sc.parallelize([('x',1), ('x',1), ('y', 1), ('z', 1)])

example.groupByKey()
x [1,1]
y [1]
z [1]

如何获得Iterator 的总和?我尝试了类似下面的方法,但它不起作用

example.groupByKey().map(lambda (x,iterator) : (x,sum(iterator))
example.groupByKey().map(lambda (x,iterator) : (x,list(sum(iterator)))

【问题讨论】:

    标签: python apache-spark iterator pyspark rdd


    【解决方案1】:

    您可以简单地使用mapValuessum

    example.groupByKey().mapValues(sum)
    

    虽然在这种特殊情况下reduceByKey 效率更高:

    example.reduceByKey(lambda x, y: x + y)
    

    from operator import add
    
    example.reduceByKey(add)
    

    【讨论】:

      【解决方案2】:

      要添加@zero323 的答案,另一种解决方案是:

      example.groupByKey().map(lambda (x,iterator) : (x,len(iterator)))
      

      【讨论】:

      • 您确定这按预期工作吗?据我了解,您只是创建了一个列出 X 变量和迭代器长度的 lambda 函数,这并没有总结它们。我正在学习 spark 并正在阅读教程。上面的语句只是将 X 和迭代器的长度配对。它不会对迭代器求和。
      【解决方案3】:

      你也可以这样做:

      wordCountsGrouped = wordsGrouped.groupByKey().map(lambda (x,y):(x,map(sum,y))).map(lambda (x,y):(x,y[0]))
      

      有点晚了,但我刚刚找到了这个解决方案

      【讨论】:

      • 您能详细说明您的解决方案吗?
      猜你喜欢
      • 1970-01-01
      • 2021-11-08
      • 1970-01-01
      • 2011-09-18
      • 2015-07-28
      • 2018-01-05
      • 2021-06-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多