首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python pySpark :运行总计算的reduceByKey

Python pySpark :运行总计算的reduceByKey
EN

Stack Overflow用户
提问于 2017-04-16 17:42:14
回答 2查看 602关注 0票数 0

在一个连接之后,我有一个元组列表,它看上去就像这样

代码语言:javascript
复制
                        [(u'something1', u'500'),
                         (u'something1', u'200'),
                         (u'something1', u'300'),
                         (u'something2', u'200'),
                         (u'something2', u'600'),
                         (u'something2', u'400')]

我认为元组开头的U代表Unicode字符。

我用pySpark编写了一个函数来进行计算,得到类似这样的结果。函数基本上需要对每个键的计数总数进行汇总。

代码语言:javascript
复制
              (something1, 1000),
               (something2, 1200)

这是我的功能

代码语言:javascript
复制
                 def calc_counts(a, b)
                     return a+b

然后我做了一个

代码语言:javascript
复制
              joined_data.reduceByKey(calc_counts).collect()

这给了我一个结果,它是一个跨越10条线的数字,如(u‘omeing1,11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111,)

如何重新编辑该函数calc_counts。

注意:I可能无法导入任何库,因为这是在控制台执行的,而不是作为存储的文件执行的。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-04-16 19:40:05

如果您已经在使用spark,那么使用现有的apis可以非常简单地实现您想要实现的目标。为已经在工作的apis编写自己的函数是没有意义的。

我想,你加入后的数据如下-

代码语言:javascript
复制
data =    [(u'something1', u'500'),
            (u'something1', u'200'),
            (u'something1', u'300'),
            (u'something2', u'200'),
            (u'something2', u'600'),
            (u'something2', u'400')]

rdd = sc.parallelize(data)

要找出每个键的总数之和,只需-

代码语言:javascript
复制
rdd \
.mapValues(lambda x : int(x)) \
.reduceByKey(lambda x,y : x+y) \
.collect()

在这里,mapValues将将当前以字符串格式的u'500'格式的值转换为整数500,而匿名函数lambda x,y : x+y将对所有键的所有值进行求和。

票数 1
EN

Stack Overflow用户

发布于 2017-04-16 19:51:53

这是另一种解决方案,您还可以使用groupby按第一个键分组,并将每个组相加在一起。

代码语言:javascript
复制
from pyspark.sql import Row
rdd = spark.sparkContext.parallelize([
    (u'something1', u'500'),
    (u'something1', u'200'),
    (u'something1', u'300'),
    (u'something2', u'200'),
    (u'something2', u'600'),
    (u'something2', u'400')])

out = rdd.groupBy(lambda x: x[0]).map(lambda x: Row(**{'key': x[0], 'sum': sum([int(e[1]) for e in x[1]])})).collect()

outRow的列表

代码语言:javascript
复制
[Row(key='something2', sum=1200), Row(key='something1', sum=1000)]
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43440143

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档