在一个连接之后,我有一个元组列表,它看上去就像这样
[(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编写了一个函数来进行计算,得到类似这样的结果。函数基本上需要对每个键的计数总数进行汇总。
(something1, 1000),
(something2, 1200)这是我的功能
def calc_counts(a, b)
return a+b然后我做了一个
joined_data.reduceByKey(calc_counts).collect()这给了我一个结果,它是一个跨越10条线的数字,如(u‘omeing1,11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111,)
如何重新编辑该函数calc_counts。
注意:I可能无法导入任何库,因为这是在控制台执行的,而不是作为存储的文件执行的。
发布于 2017-04-16 19:40:05
如果您已经在使用spark,那么使用现有的apis可以非常简单地实现您想要实现的目标。为已经在工作的apis编写自己的函数是没有意义的。
我想,你加入后的数据如下-
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)要找出每个键的总数之和,只需-
rdd \
.mapValues(lambda x : int(x)) \
.reduceByKey(lambda x,y : x+y) \
.collect()在这里,mapValues将将当前以字符串格式的u'500'格式的值转换为整数500,而匿名函数lambda x,y : x+y将对所有键的所有值进行求和。
发布于 2017-04-16 19:51:53
这是另一种解决方案,您还可以使用groupby按第一个键分组,并将每个组相加在一起。
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()out是Row的列表
[Row(key='something2', sum=1200), Row(key='something1', sum=1000)]https://stackoverflow.com/questions/43440143
复制相似问题